我有5个片段的活动,这些片段可以通过按BottomNavigationView
中的按钮进行切换:
bottomNavigationView.setOnNavigationItemSelectedListener(item -> {
switch (item.getItemId()) {
case R.id.first:
replaceFragment(FIRST_TAG);
return true;
case R.id.other:
// last four fragments
default:
return false;
}
});
在replaceFragment中:
private void replaceFragment(@NonNull String tag) {
if (!checkFragment(tag)) {
addFragment(getFragmentByTag(tag), tag);
}
showFragment(tag);
}
сheckFragment:
private boolean checkFragment(String tag) {
return fm.findFragmentByTag(tag) != null;
}
addFragment:
private void addFragment(Fragment fragment, String tag) {
if (!checkFragment(tag)) {
fm.beginTransaction().add(R.id.frame, fragment, tag).hide(fragment).commit();
}
}
showFragment:
private void showFragment(String tag) {
// currentFragmentTag defines as FIRST_TAG in fields block
currentFragment = fm.findFragmentByTag(currentFragmentTag);
FragmentTransaction transaction = fm.beginTransaction();
if (currentFragment != null) {
transaction.hide(currentFragment);
}
transaction
.attach(getFragmentByTag(tag))
.show(getFragmentByTag(tag))
.commit();
currentFragmentTag = tag;
}
这样做是为了避免每次显示片段时都在片段中加载数据!所有添加到FragmentManager
的片段仅一次,以后仅调用 hide(previousFragment)和 show(nextFragment)。
这很好!
在应用程序进入后台并启动新的重型应用程序之前。我的应用程序在后台活动被破坏,当我返回应用程序时,只有BottomNavigationView
且显示为空。
我检查了调试。 FragmentManaget.getActiveFragments()
返回五个片段的列表。
因此,活动被还原,FragmentManager
被还原,FragmentManager
包含片段。
为什么片段未显示在屏幕上?
答案 0 :(得分:0)
浏览代码后,我能想到的是将五个片段之一设置为在应用程序运行时显示的默认片段。 尝试类似的东西:
bottomNavigationView.getMenu().findItem(R.id.first).setChecked(true);
在onCreate()
或onResume()
内部进行;
祝你好运!