因此,我的一个android片段(主细节设置中的细节片段)有几种可能的布局,具体取决于用户想要做什么,其中一个布局包含大约十几个EditText字段供用户输入数据
如果用户输入数据,然后切换到另一个布局或另一个片段(从细节到主片段),我想在执行切换之前保存他们输入的内容,而不需要用户做任何事情。因此,我需要知道特定布局ID何时被充气,然后被放气/销毁/覆盖等等。
我该怎么做? onCreateView()
,我正在给新布局充气,似乎不够,因为它似乎没有提供一种方法来访问之前的内容,如果用户切换到主片段,也不会调用AFAIK。 getActivity().getCurrentFocus()
开头的onCreateView()
会返回一个视图,但与R.layout.my_layout
相比,getID()似乎不匹配,并且在布局中的元素上调用getActivity().getCurrentFocus().findViewByID() != null
也不起作用。
另外,我什么时候进行保存?
编辑:我应该覆盖onDestroyView()
并在那里运行保存代码吗?每当我尝试这样做时,应用程序崩溃。
答案 0 :(得分:0)
基于Fragments布局ID保存和恢复临时数据,我想是非常反模式的。
相反,将输入数据作为名称 - 值对添加到“实例状态”Bundle
,覆盖片段的onSaveInstanceState(Bundle savedInstanceState)
:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putBoolean("myCheckboxState", myCheckBox.isChecked());
savedInstanceState.putDouble("myDouble", 1.9);
savedInstanceState.putInt("myInt", 1);
savedInstanceState.putString("myTextViewString", myTextView.getText());
// etc.
}
(改编自this answer)
将Fragment再次添加到容器后,可以在各种生命周期方法中访问此Bundle
。例如,通过覆盖onActivityCreated(Bundle savedInstanceState)
方法,您可以访问此Bundle
并使用相应的setter方法预填表单输入。
根据您的持久性要求,您还可以更全面地存储数据,而不仅仅是存储在Fragments实例状态中。