onPause()&用于创建UI的onSaveInstanceState()

时间:2013-06-10 17:44:50

标签: android

首先,我已搜索此信息大约一周,发现很少。所以希望这篇长篇大论可以帮助其他新人。

我已从UI创建JSON。此UI具有各种Views。例如EditTextRadioButtonCheckBoxSpinner等。现在我需要考虑某些不可避免的情况。屏幕旋转,电话呼叫,后退按钮,主页按钮等。由于所有这些Views都是在网络呼叫/响应之后创建的,这需要时间,我不想每次都重复此操作。因此,保存实际的RadioButtonEditText以及RadioButton上选择的内容或键入EditText的内容非常重要。从我读过的屏幕旋转开始,我使用onSaveInstanceState()。对于其他任何事情,我会使用onPause(),因为这是唯一可以被召唤的东西。

问题是我不知道如何在Viewssharedprefs中使用无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)

然而,这并没有保存其中的值。

那么如何在ViewsonSavedInstanceState()中保存这些onPause() 的值?也许更重要的是,我需要两者吗?我可以使用onPause()吗?

谢谢

1 个答案:

答案 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中,或者放入静态类级别变量(不是最安全的方式)保留信息,但确实有效。)

希望这会有所帮助。如果我完全脱离主题,请告诉我