Листая фрагменты, приложение рухнуло - PullRequest
0 голосов
/ 03 ноября 2019

Как заголовок, как я могу это исправить

Ошибка

java.lang.RuntimeException: com.example.doanlttbdd.MainActivity@28acf243 должен реализовывать OnFragmentInteractionListener

Есть MainActivity

public class MainActivity extends AppCompatActivity {

private Toolbar mToolbar;
private ViewPager viewPager;
private TabLayout tabLayout;
private TabsAccessorAdapter tabsAccessorAdapter;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mToolbar= findViewById(R.id.main_page_toolbar);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setTitle("F9");

    viewPager= findViewById(R.id.main_tabs_paper);
    tabsAccessorAdapter= new TabsAccessorAdapter(getSupportFragmentManager());
    viewPager.setAdapter(tabsAccessorAdapter);

    tabLayout= findViewById(R.id.main_tabs);
    tabLayout.setupWithViewPager(viewPager);

}

Вот мой adapter

public TabsAccessorAdapter(@NonNull FragmentManager fm, int behavior) {
    super(fm, behavior);
}

@NonNull
@Override
public Fragment getItem(int i) {
    switch (i){
        case 0:
            ChatsFragment chatsFragment=new ChatsFragment();
            return chatsFragment;
        case 1:
            GroupsFragment groupsFragment=new GroupsFragment();
            return groupsFragment;
        case 2:
            ContactsFragment contactsFragment=new ContactsFragment();
            return contactsFragment;
            default:
                return null;
    }
}
@Override
public int getCount() {
    return 3;
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {

    switch (position){
        case 0:
            return "Chats";

        case 1:
            return "Groups";

        case 2:
            return "Contacts";

        default:
            return null;
    }
}

Мой чатсфрагмент

public class ChatsFragment extends Fragment {


public ChatsFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_chats, container, false);
}

другой фрагмент, как я думаю, это такпотому что я использую androidx, поэтому я не могу найти решение, чтобы исправить это в интернете

RedLine в этом (getSupportFragmentManager())

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Сначала быстрое решение, затем объяснение

public class MainActivity extends AppCompatActivity implements OnFragmentInteractionListener

Он выделит красным цветом MainActivity, нажмите alt + enter и выберите решение, к которому добавятся недостающие методы.

Проблема в том, чтоодин из ваших фрагментов требует, чтобы родительское действие реализовало этот интерфейс для использования в качестве обратного вызова. Вероятно, фрагмент делает что-то вроде этого

@Override
onAttach...
if context is casteable to the Interface then initialize a field, otherwise crash with the message

Это общие шаблоны. Обратный вызов в родительском действии используется для координации с другими фрагментами. Это способ узнать, когда что-то происходит с фрагментом, а затем сделать что-то с другим. Исключение - убедиться, что вы реализуете необходимый интерфейс.

Это также, вероятно, происходит при использовании фрагмента wizarf в Android Studio, но не при прочтении флажка Include callback...

0 голосов
/ 03 ноября 2019
  1. Создайте новый проект.
  2. создайте адаптер пейджера TabsPagerAdapter.java

    import info.androidhive.tabsswipe.GamesFragment;
    import info.androidhive.tabsswipe.MoviesFragment;
    import info.androidhive.tabsswipe.TopRatedFragment;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    
    public class TabsPagerAdapter extends FragmentPagerAdapter {
    public TabsPagerAdapter(FragmentManager fm) {
        super(fm);
    }
    
    @Override
    public Fragment getItem(int index) {
    
        switch (index) {
        case 0:
            // Top Rated fragment activity
            return new TopRatedFragment();
        case 1:
            // Games fragment activity
            return new GamesFragment();
        case 2:
            // Movies fragment activity
            return new MoviesFragment();
        }
    
        return null;
    }
    
    @Override
    public int getCount() {
        // get item count - equal to number of tabs
        return 3;
    }
    }
    
  3. Теперь создайте представление первой вкладки фрагмента_топа_доставки.xml

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
      android:background="#fa6a6a" >
    
     <TextView android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:gravity="center"
       android:text="Design Top Rated Screen"
       android:textSize="20dp"
       android:layout_centerInParent="true"/>
    
    
      </RelativeLayout>
    
  4. теперь создайте TopRatedFragment.java

    import info.androidhive.tabsswipe.R;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class TopRatedFragment extends Fragment {
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_top_rated, container, false);
    return rootView;
      }
    
    }
    
  5. аналогичным образом повторите шаги 3 и 4 для создания GamesFragment и MoviesFragment и их XML

  6. теперь создайте MainActivity.java

    import info.androidhive.tabsswipe.adapter.TabsPagerAdapter;
    import info.androidhive.tabsswipe.R;
    import android.app.ActionBar;
    import android.app.ActionBar.Tab;
    import android.app.FragmentTransaction;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.view.ViewPager;
    import android.view.Menu;
    
    public class MainActivity extends FragmentActivity implements
        ActionBar.TabListener {
    
    private ViewPager viewPager;
    private TabsPagerAdapter mAdapter;
    private ActionBar actionBar;
    // Tab titles
    private String[] tabs = { "Top Rated", "Games", "Movies" };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // Initilization
    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    
    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        
    
    // Adding Tabs
    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }
    
    /**
     * on swiping the viewpager make respective tab selected
     * */
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    
        @Override
        public void onPageSelected(int position) {
            // on changing the page
            // make respected tab selected
            actionBar.setSelectedNavigationItem(position);
        }
    
        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }
    
        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
      });
    }
    
    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }
    
    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // on tab selected
    // show respected fragment view
    viewPager.setCurrentItem(tab.getPosition());
    }
    
    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    
      }
    
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...