首先,我已搜索此信息大约一周,发现很少。所以希望这篇长篇大论可以帮助其他新人。
我已从UI
创建JSON
。此UI
具有各种Views
。例如EditText
,RadioButton
,CheckBox
,Spinner
等。现在我需要考虑某些不可避免的情况。屏幕旋转,电话呼叫,后退按钮,主页按钮等。由于所有这些Views
都是在网络呼叫/响应之后创建的,这需要时间,我不想每次都重复此操作。因此,保存实际的RadioButton
或EditText
以及RadioButton
上选择的内容或键入EditText
的内容非常重要。从我读过的屏幕旋转开始,我使用onSaveInstanceState()
。对于其他任何事情,我会使用onPause()
,因为这是唯一可以被召唤的东西。
问题是我不知道如何在Views
或sharedprefs
中使用无ID 以编程方式创建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()
中保存这些onPause()
和的值?也许更重要的是,我需要两者吗?我可以使用onPause()
吗?
谢谢
答案 0 :(得分:1)
我没试过这个,但听起来它会在实践中发挥作用。创建活动时(在JSON填充之前)创建自己的ViewGroup。从那里,阅读JSON并将您获得的每个视图添加到VeiwGroup。然后,当你想保存信息或其他什么时候这样做
int viewCount = mViewGroup.getChildCount();
for(i=0;i<viewCount;i++) {
newView = mViewGroup.getChildAt(i);
if (newView instanceOf EditText) {
EditText newEditText = (EditText)newView
string value = newEditText.getText();
}
else if (newView instanceOf RadioButton) {
same as above ^
etc...
}
}
然后,对于您拉的每个值,将它们添加到数组中,甚至可以使用NamedPair来存储它们的ID和值(通过ID我指的是它的视图的索引)。所以
public List<String> lstEditTextValues = new ArrayList<String>();
在完成所有操作之后,您可以通过每个文件进行迭代,并将其作为单个值保存到捆绑包中,保存在共享的pref中,或者放入静态类级别变量(不是最安全的方式)保留信息,但确实有效。)
希望这会有所帮助。如果我完全脱离主题,请告诉我