我有一个带有框架布局和底部导航视图的活动...我有 4 个片段(A、B、C、D)...问题是当我在单击菜单项加载片段 B 后从 A 切换到 B 时,片段 A 被破坏了......我在所有回调方法(OnAttach,OnCreate,OnCreateView.....等)涉及片段生命周期和 onDestroyView 在我更改片段时总是被调用......因此,当我回到以前打开的片段时,onCreateView再次被调用。
这是我的活动课:
public class Home extends AppCompatActivity
{
private BottomNavigationView.OnNavigationItemSelectedListener
mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item)
{
Fragment fragment = null;
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
switch (item.getItemId())
{
case R.id.navigation_a:
if (!(currentFragment instanceof FragmentA))
fragment = FragmentA.newInstance();
break;
case R.id.navigation_b:
if (!(currentFragment instanceof FragmentB))
fragment = FragmentB.newInstance();
break;
case R.id.navigation_c:
if (!(currentFragment instanceof FragmentC))
fragment = FragmentC.newInstance();
break;
case R.id.navigation_d:
if (!(currentFragment instanceof FragmentD))
fragment = FragmentD.newInstance();
break;
}
if (fragment != null) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
return true;
}
return false;
}
};
//TODO Handle life-cycle methods when switching between fragments
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.add(R.id.fragment_container, FragementA.newInstance())
.commit();
fm.popBackStack();
BottomNavigationView navigation = findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
moveTaskToBack(true);
return true;
}
return false;
}
}
我想知道我在这里到底错过了什么......提前感谢
好吧,您没有将片段添加到后备堆栈中。
您每次单击都会创建新实例。
如果您想用相同的替换或添加然后添加到 fragmentransaction 的 backstack 中,请保留对它们的引用,但您将需要标签来导航以前的标签。
尝试使用 setRetainInstance(true); 作为您的片段。
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}