重新创建应用程序时,片段与底部导航视图图标不匹配
Fragments does not match bottom navigation view icon when app gets recreated
我正在开发一个使用带有底部导航视图的片段的应用程序,我遇到了一个非常麻烦的问题。例如,假设我在设置页面上,这是链接到底部导航视图的第三个图标的第三个片段。
当我退出我的应用程序并使用另一个应用程序时,这意味着我的应用程序处于后台(例如,我正在观看 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;
};
}
我发现我的问题与片段的生命周期有关,当 activity 被重新创建时,即使在底部导航中选择的图标以某种方式保存,同样的过程再次进行,我注意到活动片段也被保存但由于代码而不断被删除所以我想出了这个:
@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,因此会相应地添加片段,即使您不在 activity 中重写 onSaveInstanceState,恢复 [=17] 时 savedInstanceState 参数仍将为非空=].它只是一个空的 Bundle。因此,您可以使用它来隐藏其他片段,以便在重新创建 activity 时显示活动片段。
我正在开发一个使用带有底部导航视图的片段的应用程序,我遇到了一个非常麻烦的问题。例如,假设我在设置页面上,这是链接到底部导航视图的第三个图标的第三个片段。
当我退出我的应用程序并使用另一个应用程序时,这意味着我的应用程序处于后台(例如,我正在观看 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;
};
}
我发现我的问题与片段的生命周期有关,当 activity 被重新创建时,即使在底部导航中选择的图标以某种方式保存,同样的过程再次进行,我注意到活动片段也被保存但由于代码而不断被删除所以我想出了这个:
@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,因此会相应地添加片段,即使您不在 activity 中重写 onSaveInstanceState,恢复 [=17] 时 savedInstanceState 参数仍将为非空=].它只是一个空的 Bundle。因此,您可以使用它来隐藏其他片段,以便在重新创建 activity 时显示活动片段。