我的代码:
public class MainActivity extends AppCompatActivity {
private FragmentA fragmentA;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
fragmentA = FragmentA.newInstance();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_a_container, fragmentA, "FRAGMENT_A");
fragmentTransaction.commit();
}
else {
fragmentA = (FragmentA) getSupportFragmentManager().findFragmentByTag("FRAGMENT_A");
}
}
}
我真的不知道自己在做什么,但这是我现在所做的。我为Fragment定义了一个容器,然后我使用FragmentTransaction将它替换为Fragment。我感到困惑的部分是else语句。
我应该以不同的方式构建这个吗?
我认为配置更改消除了活动和碎片,那么为什么要检查一些支持管理器中的Fragment?这是否意味着片段实际上没有被销毁?与此同时,除非我使用onSaveInstanceState
或getArguments()
方法,否则它们似乎会被破坏,因为它们似乎已重置。
编辑:这样做有什么不对:
public class MainActivity extends AppCompatActivity {
private FragmentA fragmentA;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentA = FragmentA.newInstance();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_a_container, fragmentA, "FRAGMENT_A");
fragmentTransaction.commit();
}
}
答案 0 :(得分:1)
在配置更改时,它们会被摧毁并重新创建,在本例中为SupportFragmentManager
。
回答你的问题:
- 我应该以不同的方式构建这个吗?
醇>
不,如果没有保存状态,那么你应该如何创建片段,并在有状态时检索它们。另请参阅我的回答here;
- a)为什么要在某个支持经理中检查片段?
醇>
因为管理器在配置更改时为您处理片段的生命周期。
- b)这是否意味着片段实际上没有被破坏?
醇>
不,它确实被摧毁了。请参阅此diagram以获取参考。
编辑以回答评论中的一些问题:
但是Fragment中的任何成员变量在配置更改时都会完全丢失,除非我将它们保存在Fragment的onSaveInstanceState中,对吗?
这是正确的。由于您的片段正在被销毁,因此onSaveInstanceState
上未保存的所有内容都将丢失。
那么我究竟要恢复什么?
你没有恢复任何东西。您只检索对先前创建的片段的引用。您可以在片段的onRestoreInstanceState()
方法上恢复变量。
这样做有什么问题(问题编辑中的代码)?
如果您这样做,则要向R.id.fragment_a_container
容器添加新的片段实例。因此,旧片段将与您在onSaveInstanceState()
上保存的状态一起丢失。它将是一个新片段,其中包含新信息,并且不会为其调用<{1}} 事件。