【问题标题】:Swiping through fragments then app crashed刷过片段然后应用程序崩溃
【发布时间】:2020-02-29 03:23:31
【问题描述】:

像标题一样,我该如何解决它

错误

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);

}

这是我的适配器

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())

【问题讨论】:

  • 错误信息不是很清楚MainActivity@28acf243 must implement OnFragmentInteractionListener吗?
  • 请发布您的片段类
  • 我有 3 个片段聊天组联系人,里面什么都没有

标签: java android androidx


【解决方案1】:

先快速解决再解释

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

这些是常见的模式。父活动中的回调用于与其他片段协调。这是一种知道片段何时发生某些事情然后在其他片段上执行某些操作的方法。抛出的异常是为了确保您实现了所需的接口。

这也可能发生在 Android Studio 上使用片段向导但未读取复选框 Include callback...

【讨论】:

    【解决方案2】:
    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. 现在创建第一个选项卡视图 fragment_top_rated.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) {
      
        }
      
      }
      

    【讨论】:

    • 解决方案的第一步是创建一个新项目?
    • 这是您可以实施的逐步完成过程。根据需求,你可以在你的项目中使用这段代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2018-08-26
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多