滑动片段然后应用程序崩溃

时间:2019-11-03 17:29:42

标签: java android androidx

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

错误

  

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

}

这是myAdapter

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,所以我找不到在互联网上修复它的任何解决方案

(getSupportFragmentManager())

中的RedLine

2 个答案:

答案 0 :(得分: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上使用片段wizarf但未读取复选框Include callback...

,也可能会发生这种情况

答案 1 :(得分:0)

  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) {
    
      }
    
    }