首先,我已经搜索了大约一个星期的信息,但发现很少。所以希望这篇长篇文章能帮助其他一些新人。
我创建了一个UI
来自JSON
. 这UI
有各种Views
。例如EditText
, RadioButton
, CheckBox
,Spinner
等。现在我需要考虑某些不可避免的情况。屏幕旋转、电话呼叫、返回按钮、主页按钮等。由于所有这些Views
都是在网络呼叫/响应之后创建的,这需要时间,我不想每次都重复此操作。因此,保存实际的RadioButton
orEditText
以及在RadioButton
or上选择的内容EditText
是非常重要的。从我读过的屏幕旋转中,我使用onSaveInstanceState()
. 对于我会使用的其他任何东西,onPause()
因为它是唯一需要调用的东西。
问题是我不知道如何存储没有 id 的编程方式创建Views
,更不用说它们持有的值了。让我们看看我的代码,然后讨论我认为目前可行的方法。sharedprefs
bundle
allEdit = new ArrayList<EditText>();
else if (map.get(TAG_FIELD).equals(et)) {
Log.v("RESPONSE", "About to create an EditText");
// find
LinearLayout content = (LinearLayout) getActivity()
.findViewById(R.id.add);
// create
TextView tv = new TextView(getActivity());
EditText et = new EditText(getActivity());
LinearLayout ll1 = new LinearLayout(getActivity());
// set
tv.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT));
et.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
ll1.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
tv.setText(map.get(TAG_NAME));
ll1.setOrientation(LinearLayout.HORIZONTAL);
// add
ll1.addView(tv);
ll1.addView(et);
allEdit.add(et);
content.addView(ll1);
}
因此,在上面的示例中,我创建了一个EditText
并将其存储在一个ArrayList<EditText>
. 现在我的想法是,onPause()
我可以做这样的事情。
for (int i = 0; i < allEdit.size(); i++) {
EditText et = allEdit.get(i);
String input = et.getText().toString();
prefsEdit.put(input);
}
我认为这可能有效,它也可能String
一遍又一遍地覆盖共享偏好中的“输入”。不完全确定它是如何工作的。它还没有解决如何保存实际EditText
,以便不必重新创建它。
现在onSavedInstanceState()
我想我可能只需将整个插入ArrayList<EditText>
为可序列化的,对吗?像这样...
putSerializable("key", allEdit)
但是,这不会保存其中的值。
那么如何将这些Views
及其值保存在onSavedInstanceState()
and中onPause()
?也许更重要的是,我需要两者吗?我可以侥幸逃脱onPause()
吗?
谢谢