我有一个带有三个选项卡的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中的片段的方法。
我已经坐了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;
}
}
谢谢
尝试使用如下所示的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] 删除。
我来说两句