首页 > 解决方案 > 从后台返回时,Android 片段被置于前一个片段之上

问题描述

在我的 MainActivity 中,我有三个片段。还有一个 BottomNavigationView 处理要显示的片段。

这就是我在 MainActivity 的 OnCreate 中的内容:

   fragmentManager.beginTransaction().add(R.id.content_main, mTrendingFragment, "3").hide(mTrendingFragment).commit();
   fragmentManager.beginTransaction().add(R.id.content_main, mFavoriteFragment, "2").hide(mFavoriteFragment).commit();
   fragmentManager.beginTransaction().add(R.id.content_main, mUpcomingViewPagerFragment, "1").commit();

现在不幸的是,当我从后台回到我的应用程序时,这 3 个片段被放置在旧片段之上,这会产生一种奇怪的行为,导致 UI 出现故障

当我单击 BottomNavigationView 的项目时,这就是我显示片段的方式:

fragmentManager.beginTransaction().hide(mCurrentFragment).show(mUpcomingViewPagerFragment).commit();
mCurrentFragment = mUpcomingViewPagerFragment; 

我该如何解决这种行为?

标签: androidandroid-fragments

解决方案


重新创建活动时会自动恢复片段。因此,您所做的任何设置onCreate()都应进行if (savedInstanceState == null)检查,以确保您不会在已恢复的片段之上添加额外的片段。

if (savedInstanceState == null) {
    // Create new Fragment instances
    mTrendingFragment = new TrendingFragment();
    mFavoriteFragment = new FavoriteFragment();
    mUpcomingViewPagerFragment = new UpcomingViewPagerFragment();
    
    // And add those new instances to the FragmentManager
    fragmentManager.beginTransaction().add(R.id.content_main, mTrendingFragment, "3").hide(mTrendingFragment).commit();
    fragmentManager.beginTransaction().add(R.id.content_main, mFavoriteFragment, "2").hide(mFavoriteFragment).commit();
    fragmentManager.beginTransaction().add(R.id.content_main, mUpcomingViewPagerFragment, "1").commit();
} else {
    // Get the already existing fragments from FragmentManager
    mTrendingFragment = (TrendingFragment) fragmentManager.findFragmentByTag("3");
    mFavoriteFragment = (FavoriteFragment) fragmentManager.findFragmentByTag("2");
    mUpcomingViewPagerFragment = (UpcomingViewPagerFragment) fragmentManager.findFragmentByTag("1");

推荐阅读