App终止后,Android BottomNavigation片段会显示/隐藏

时间:2019-07-28 06:51:53

标签: java android android-fragments

我正在尝试在后台(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.hidetransaction.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而不是每次都创建新实例。任何帮助表示赞赏。

1 个答案:

答案 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