我从Are fragments saved by default with savedInstanceState?获得了#34;为了在活动被破坏时保留一个片段,所以它会自动重新播放,你应该调用`Fragment.setRetainInstance(true)'"
但是在https://developers.facebook.com/docs/android/login-with-facebook/v2.1#dialogs, 他们没有在片段的构造函数中使用此方法,但仍然能够将片段保留在oncreate中 他们这样做的代码是
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
// Add the fragment on initial activity setup
mainFragment = new MainFragment();
getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, mainFragment)
.commit();
} else {
// Or set the fragment from restored state info
mainFragment = (MainFragment) getSupportFragmentManager()
.findFragmentById(android.R.id.content);
}
}
有没有人在不使用setretaininstance的情况下使用什么技巧来保留该片段?
答案 0 :(得分:1)
没有技巧,FragmentManager
负责管理片段,它保留使用片段事务添加的片段列表并处理后栈。当方向发生变化时,将自动重新创建这些片段,以便在方向更改之前重新创建视图层次结构。请记住,那些重新创建的片段是新实例。您需要做的就是避免在bundle不为null时创建片段,因为它将自动重新创建。您可以向FragmentManager请求片段的参考:
mainFragment = (MainFragment) getSupportFragmentManager()
.findFragmentById(android.R.id.content);
现在,当您设置setRetainInstance(true)
时,当方向更改发生时(将不会调用onDestroy()),片段不会被销毁,并且片段的完全相同的实例将转到在方向改变之后附加到新的Activity(不会调用onCreate(),因为片段从未被销毁)。这很有用,因为实例会在方向更改时保留其所有数据。