使用compat lib v1(因为某些错误而不使用v2 | 3); 这个问题的一个变种.
我有一个片段,其UI具有各种控件,我希望在方向更改时保持其状态.
父方活动在方向改变时被销毁(请不要告诉我有关清单变化以避免活动娱乐!!!!).
片段调用setRetainInstance(true).
1)现在我的理解是,具有唯一ID的视图应该保留一些状态,例如方向更改.鉴于此,我期望一个非null的bundle,onCreateView|onActivityCreated但它是null.
2)在任何情况下如果我保存状态onSaveInstanceState(确保我调用super)我仍然在'onCreateView | onActivityCreated'中得到一个空包
3)如果我不调用setRetainInstance(true)那么onCreateView|onActivityCreated即使我没有`onSaveInstanceState'方法,我也会得到一个非空包.
我的问题是,这是否按预期工作,我对生命周期的理解被打破了?无论如何,我猜测对我来说最好的方法是保留片段,然后在片段中保持控件的状态.
提前致谢.彼得.
我对保存位于Android片段内部的View状态的最佳做法感到困惑。
我以为那setRetainInstance(true)可以解决问题。但是,尽管这确实保留了中View声明的旧全局引用Fragment,但在放大布局时将不会使用这些视图。因此,我必须手动将属性从旧的全局View引用转移到膨胀布局中的新View。请参阅下面的代码,了解我的操作方式。
public static class MyFragment extends Fragment {
// I need to save the state of two views in the fragment
ProgressBar mProgress;
TextView mText;
@Override public void onCreate(Bundle savedInstanceState) {
// savedInstanceState == null if setRetainInstance == true
super.onCreate(savedInstanceState);
// Retain the instance between configuration changes
setRetainInstance(true);
}
@Override public View onCreateView(LayoutInflater i, ViewGroup c, Bundle b) {
// Inflate xml layout for fragement (orientation dependent)
View v = i.inflate(R.layout.fragment_main, c, false); …Run Code Online (Sandbox Code Playgroud)