问题描述
我仍然没有得到这一部分,我试图确保实例在一次旋转时被保存一次,以便进行良好的实践,但是我已经用尽了所有的知识,我旋转的所有内容都导航回到了第一个片段的主堆栈。 请查看我的代码,并告诉我我做错了什么。
成为一名自学成才的Android开发人员可能会充满挑战,但我非常感谢这个网站。
private final BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= item -> {
List<Fragment> fragments = getSupportFragmentManager().getFragments();
boolean isOnStack = false;
switch (item.getItemId()) {
case R.id.action_transactions:
fragment = new TransactionsFragment();
for(Fragment frag:fragments){
/* Check if fragment is on stack*/
if(frag instanceof TransactionsFragment){
isOnStack = true;
break;
}
}
break;
case R.id.action_budget:
fragment = new BudgetFragment();
for(Fragment frag:fragments){
/* Check if fragment is on stack*/
if(frag instanceof BudgetFragment){
isOnStack = true;
break;
}
}
}
break;
}
/*
Prevent duplicate record on back stack and keep consistent back navigation
*/
if (!isOnStack)
getSupportFragmentManager().beginTransaction()
.replace(R.id.content, fragment, TAG)
.addToBackStack(null)
.commit();
return true;
};
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(SELECTED_ITEM_POSITION,mPosition);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mPosition = savedInstanceState.getInt(SELECTED_ITEM_POSITION);
}
1楼
如果您的问题是未保存数据,请检查以下代码:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(SELECTED_ITEM_POSITION,mPosition);
}
保存状态时,需要先存储数据,然后再调用super方法。 调用super方法时,将保存数据。 就您而言,您要先保存捆绑软件,然后再放入一些数据。
以此替换您的代码(请注意,我刚刚更新了您的代码)
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt(SELECTED_ITEM_POSITION,mPosition); // put the values
super.onSaveInstanceState(outState); // then store the bundle
}
2楼
您需要为此使用.findFragmentByTag
,首先检查该片段是否为null。
尝试将此代码添加到您的onCreate方法中。
全球
私有片段片段;
onCreate
fragment = getSupportFragmentManager().findFragmentByTag(TAG);
if (fragment == null) {
fragment = new TransactionsFragment();
}