重新创建应用时,片段与底部导航视图图标不匹配

问题描述 投票:0回答:1

我正在使用一个使用底部导航视图的片段的应用程序,我遇到了一个相当棘手的问题。例如,假设我在设置页面上,该页面是链接到底部导航视图的第三个图标的第三个片段。

当我退出我的应用程序并使用另一个时,这意味着我的应用程序在后台(例如我在youtube上观看视频)。当我回到我的应用程序一段时间后它被重新创建时,我注意到显示的片段将不是我退出应用程序时所显示的片段(第一个片段显示)但底部导航视图中的活动图标是离开应用程序之前我仍然是那个(设置图标)。

我想知道是否有办法确保我的片段将正确附加到其底部导航图标,如果应用程序重新创建。

这是我的代码,用于显示和链接片段到底部导航视图:

public class HomeActivity extends LocalizationActivity {



final Fragment fragment1 = new CustomFragment();
final Fragment fragment2 = new ReportFragment();
final Fragment fragment3 = new UploadFragment();
final Fragment fragment4 = new SettingFragment();

final FragmentManager fm = getSupportFragmentManager();
Fragment active = fragment1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);





    //Setting the bottom navigation view
    BottomNavigationView navigation =  findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);


    fm.beginTransaction().add(R.id.main_container, fragment4, "4").hide(fragment4).commit();
    fm.beginTransaction().add(R.id.main_container, fragment3, "3").hide(fragment3).commit();
    fm.beginTransaction().add(R.id.main_container, fragment2, "2").hide(fragment2).commit();
    fm.beginTransaction().add(R.id.main_container,fragment1, "1").commit();



}







private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = item -> {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    fm.beginTransaction().hide(active).show(fragment1).commit();
                    active = fragment1;
                    return true;

                case R.id.navigation_report:
                    fm.beginTransaction().hide(active).show(fragment2).commit();
                    active = fragment2;
                    return true;

                case R.id.navigation_backup:
                    fm.beginTransaction().hide(active).show(fragment3).commit();
                    active = fragment3;
                    return true;

                case R.id.navigation_setting:
                    fm.beginTransaction().hide(active).show(fragment4).commit();
                    active = fragment4;
                    return true;
            }
            return false;
        };
}
android android-fragments bottomnavigationview
1个回答
0
投票

我发现我的问题与片段的生命周期有关,当重新创建活动时,即使在底部导航上选择的图标以某种方式保存,同样的过程也会再次完成,我注意到活动片段也被保存了但由于代码不断删除所以我想出了这个:

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    if(savedInstanceState == null){
        fm.beginTransaction().add(R.id.main_container, fragment4, "4").hide(fragment4).commit();
        fm.beginTransaction().add(R.id.main_container, fragment3, "3").hide(fragment3).commit();
        fm.beginTransaction().add(R.id.main_container, fragment2, "2").hide(fragment2).commit();
        fm.beginTransaction().add(R.id.main_container,fragment1, "1").commit();


    } else{
        fm.beginTransaction().add(R.id.main_container, fragment4, "4").hide(fragment4).commit();
        fm.beginTransaction().add(R.id.main_container, fragment3, "3").hide(fragment3).commit();
        fm.beginTransaction().add(R.id.main_container, fragment2, "2").hide(fragment2).commit();
        fm.beginTransaction().add(R.id.main_container,fragment1, "1").hide(fragment1).commit();
    }


    //Setting the bottom navigation view
    BottomNavigationView navigation =  findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);

}

在第一次启动时,savedInstanceState为null,因此相应地添加了片段,即使您不在活动中覆盖onSaveInstanceState,恢复活动时savedInstanceState参数仍将为非null。它只是一个空的捆绑。因此,您可以使用它来隐藏其他片段,以便在重新创建活动时显示活动片段。

© www.soinside.com 2019 - 2024. All rights reserved.