我的代码:
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 语句。
我应该以不同的方式构建它吗?
我认为配置更改消除了 Activity 和 Fragment,那么为什么要在某些支持管理器中检查 Fragment?这是否意味着 Fragments 实际上不会被销毁?同时,它们似乎确实被破坏了,因为它们似乎会重置,除非我使用
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();
}
}
最佳答案
在本例中,SupportFragmentManager
会在配置更改时为您销毁和重新创建它们。
回答您的问题:
- Should I be structuring this differently?
不,如果没有已保存状态,这正是您应该创建 fragment 并在有状态时检索它们的方式。另见我的回答 here ;
- a) so why check for the Fragment in some support manager?
因为管理器会在配置更改时为您处理 fragment 的生命周期。
- b) Does this mean Fragments don't actually get destroyed?
不,它确实被摧毁了。看这个diagram供引用。
编辑以回答评论中的一些问题:
But any member variables inside that Fragment are completely lost on configuration change unless I save them in that Fragment's onSaveInstanceState, right?
没错。因为您的 fragment 正在被销毁,所有未保存在 onSaveInstanceState
上的内容都会丢失。
So then what exactly am I restoring?
你没有恢复任何东西。您只是检索对先前创建的 fragment 的引用。您在 fragment 的 onRestoreInstanceState()
方法上恢复变量。
What's wrong with doing this (the code from the edit in the question)?
如果您这样做,您将向 R.id.fragment_a_container
容器中添加一个新的 fragment 实例。因此,旧 fragment 将与您保存在 onSaveInstanceState()
中的状态一起丢失。这将是一个新 fragment ,其中包含新信息并且事件 onRestoreInstanceState()
不会 被调用。
关于android - 这是以编程方式调用 fragment 的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39925934/