我正在尝试在后台(LowMemory等)模拟App退出,但是在还原App之后,BottomNavigation片段将不再起作用。
我有以下Array / vars
private Fragment[] fragments = new Fragment[]{new HomeFragment(), new MapFragment(), new SavedFragment(), new NotificationsFragment()};
private int selected = -1;
在onCreateView
中,我正在打电话...
// open first Fragment when app starts
if (savedInstanceState == null) switchFragment(0, ShoutsHomeFragment.TAG);
else selected = savedInstanceState.getInt(SELECTED_FRAGMENT);
switchFragment
看起来
private void switchFragment(int index, String tag) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
Fragment fragment = fragmentManager.findFragmentByTag(tag);
// creating for the first time
if (fragment == null) transaction.add(R.id.tab_fragment_container, fragments[index], tag);
if (selected >= 0) transaction.hide(fragments[selected]); // <--- don't work
if (fragment != null) transaction.show(fragment); // <--- don't work
transaction.commit();
selected = index;
}
因此,transaction.hide
和transaction.show
在还原应用程序后无法正常工作,当我在BottomNavigation上点击其他项目时,它们会停留在同一片段上
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_shouts_home:
switchFragment(0, HomeFragment.TAG);
return true;
case R.id.navigation_heat_map:
switchFragment(1, MapFragment.TAG);
return true;
case R.id.navigation_loved:
switchFragment(2, SavedFragment.TAG);
return true;
case R.id.navigation_notifications:
switchFragment(3, NotificationsFragment.TAG);
return true;
}
我以此方式编程,以便在BottomNavigation上的项目之间切换时可以保留“片段”(滚动)位置。因此,我想show/hide
而不是每次都创建新实例。任何帮助表示赞赏。
答案 0 :(得分:1)
旋转屏幕时,所有活动和所有未保留的碎片都会贯穿整个生命周期。这意味着您的private Fragment[] fragments...
也将重新创建。您列表中的片段不再是FragmentManager
中的片段。这意味着隐藏将无法像调用它一样工作,并且最上面的Fragment始终是可见的。如果您使用TAG方法,则可能会起作用。
String getFragmentTagByIndex(final int index) {
switch (index) {
// Make return tag.
}
}
{
// inside switchFragment
final Fragment visibleFragment = transaction.findFragmentByTag(getFragmentTagByIndex(selected));
transaction.hide(visibleFragment);
}
您实质上是在尝试使用FragmentPagerAdapter实现ViewPager
,我建议您使用FragmentPagerAdapter