如何在Android的TabLayout中替换片段

埃雷兹

我有一个带有三个选项卡的TabLayout,每个选项卡都有自己的片段(不同的类和不同的片段类型。

public Fragment getItem(int position){
    switch (position){
        case 0:
            BooksFragment tabBooks = new BooksFragment();
            return tabBooks;
        case 1:
            NavigationFragment tabNav = new NavigationFragment();
            return tabNav;
        case 2:
            SearchFragment tabSearch = new SearchFragment();
            return tabSearch;
        default:
            return null;
    }
}

在tabBooks中,我有一张桌子和书,当有人单击一本书时,我需要打开各章。(这可以正常工作,将各章从网上获取,并在“章片段”中填充表格)。为此,我有一个章节片段。

我可能在这里做错了什么:(在BooksFragment-onListItemClick中):

fm.beginTransaction().replace(R.id.main_layout, new ChapterFragment()).commit();

fm是FragmentManager:

FragmentManager fm = getFragmentManager();

我得到的结果是所有其他片段之上的一个片段,当我切换选项卡时,它停留在所有片段之上。

我知道这是错误的,因此我也没有后退按钮功能,后退按钮将返回主屏幕,而不是我所在的上一个状态(片段)。

我只是找不到解决方案。

我正在使用

FragmentPagerAdapter

但是我猜这不是问题,问题在于

R.id.main_layout

在fm.beginTransaction调用中,或者我在FragmentManager中使用它。但我似乎找不到正确的方法来做到这一点

再次,寻找一种仅针对特定Tab更改TabLayout中的片段的方法。

  1. 在同一主题中,当有人单击工具栏中的“后退”按钮或按“后退”按钮时,我又该如何返回第一个片段(还是在同一选项卡中)。

我已经坐了2天,无法找到解决方案。

我在MainActivity中使用的页面适配器(我的唯一活动):

public class PageAdapter extends FragmentPagerAdapter {
int mNumOfTabs;

public PageAdapter(FragmentManager fm, int mNumOfTabs) {
    super(fm);
    this.mNumOfTabs = mNumOfTabs;
}

@Override
public Fragment getItem(int position){
    switch (position){
        case 0:
            BooksFragment tabBooks = new BooksFragment();
            return tabBooks;
        case 1:
            NavigationFragment tabNav = new NavigationFragment();
            return tabNav;
        case 2:
            SearchFragment tabSearch = new SearchFragment();
            return tabSearch;
        default:
            return null;
    }
}

@Override
public int getCount(){
    return mNumOfTabs;
}

}

主要活动:

public ViewPager pager;
PagerAdapter adapter;

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("ספרים"));
    tabLayout.addTab(tabLayout.newTab().setText(R.string.navigation_title));
    tabLayout.addTab(tabLayout.newTab().setText(R.string.search_title));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    pager = (ViewPager) findViewById(R.id.pager);
    adapter = new PageAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
    pager.setAdapter(adapter);
    pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){
        @Override
        public void onTabSelected(TabLayout.Tab tab){
            pager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab){}

        @Override
        public void onTabReselected(TabLayout.Tab tab){}
    });
}

图书片段:

@Override
public void onListItemClick(ListView l, View v, int position, long id){
    super.onListItemClick(l, v, position, id);

    switch (displayType) {
        case CATEGORIES:
            Category cat = (Category) l.getItemAtPosition(position);
            books = cat.getBooks();
            updateDisplay(ItemType.BOOKS);
            displayType = ItemType.BOOKS;
            break;
        case BOOKS:
            Book book = (Book) l.getItemAtPosition(position);
            FragmentManager fm = getFragmentManager();
            fm.beginTransaction().replace(R.id.main_layout, new ChapterFragment()).commit();
            break;
    }
}

谢谢

android_griezmann

尝试使用如下所示的childFragmentManager代替supportFragmentManager。

@Override
public void onListItemClick(ListView l, View v, int position, long id){
    super.onListItemClick(l, v, position, id);

    switch (displayType) {
        case CATEGORIES:
            Category cat = (Category) l.getItemAtPosition(position);
            books = cat.getBooks();
            updateDisplay(ItemType.BOOKS);
            displayType = ItemType.BOOKS;
            break;
        case BOOKS:
            Book book = (Book) l.getItemAtPosition(position);
            //change this
            //FragmentManager fm = getFragmentManager();
            FragmentManager fm = getChildFragmentManager();
            fm.beginTransaction().replace(R.id.main_layout, new ChapterFragment()).commit();
            break;
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章