0

因此,我的一个 android Fragments(主从设置中的详细信息片段)具有几种可能的布局,具体取决于用户想要做什么,其中一个布局包含大约十几个 EditText 字段供用户输入数据。

如果用户输入数据,然后切换到另一个布局或另一个片段(从细节到主片段),我想在执行切换之前保存他们到目前为止输入的内容,而不需要用户做任何事情。所以我需要知道一个特定的布局 ID 是什么时候被夸大的,然后被压缩/破坏/覆盖/等等。

我该怎么做呢? onCreateView(),在我膨胀新布局的地方,似乎不够,因为它似乎没有提供访问以前存在的内容的方法,并且如果用户切换到主 Fragment 则不会调用 AFAIK。 getActivity().getCurrentFocus()在开始时onCreateView()返回一个视图,但与 相比,getID() 似乎不匹配R.layout.my_layout,并且调用getActivity().getCurrentFocus().findViewByID() != null布局中的元素也不起作用。

另外,我什么时候执行保存?

编辑:我应该在那里覆盖onDestroyView()并运行保存代码吗?每当我尝试这样做时,应用程序都会崩溃。

4

1 回答 1

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.
}

(改编自这个答案

Bundle在您的 Fragment 再次添加到容器后,这应该可以在各种生命周期方法中访问。例如,通过覆盖该onActivityCreated(Bundle savedInstanceState)方法,您可以访问它Bundle并使用相应的 setter 方法预先填写您的表单输入。

根据您的持久性要求,您还可以更全局地存储数据,而不仅仅是在 Fragments 实例状态中。

于 2013-03-31T17:09:30.763 回答