0

首先,我已经搜索了大约一个星期的信息,但发现很少。所以希望这篇长篇文章能帮助其他一些新人。

我创建了一个UI来自JSON. 这UI有各种Views。例如EditText, RadioButton, CheckBox,Spinner等。现在我需要考虑某些不可避免的情况。屏幕旋转、电话呼叫、返回按钮、主页按钮等。由于所有这些Views都是在网络呼叫/响应之后创建的,这需要时间,我不想每次都重复此操作。因此,保存实际的RadioButtonorEditText以及在RadioButtonor上选择的内容EditText是非常重要的。从我读过的屏幕旋转中,我使用onSaveInstanceState(). 对于我会使用的其他任何东西,onPause()因为它是唯一需要调用的东西。

问题是我不知道如何存储没有 id 的编程方式创建Views,更不用说它们持有的值了。让我们看看我的代码,然后讨论我认为目前可行的方法。sharedprefsbundle

    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()吗?

谢谢

4

1 回答 1

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>();

说了这么多,然后你可以遍历每一个,并通过捆绑将其保存为单独的值,保存在共享首选项中,或放入静态类级别变量(不是保留信息的最安全方式,但确实有效)。

希望这可以帮助。让我知道我是否完全偏离主题

于 2013-06-10T18:07:09.350 回答