1

我正在创建一个 Android 应用程序,其活动由静态视图和动态创建的视图混合而成。该活动包含保存在 XML 文件中的 UI 元素和基于模型类的内容动态创建的 UI 元素。(如在我的模型类中有一个数组,将为数组中的每个元素创建一个 EditText .. 并且将创建一个 Spinner 包含不同数组中的每个元素)

当涉及到动态创建的 UI 元素时,保存和恢复应用程序状态的常用方法是什么?因为我不会总是知道任何时候会存在哪些 UI 元素!目前,我的绑定代码只是在设备方向更改时重新加载数据库中的数据,从而丢失用户所做的任何更改。

为此,我在 Google/SO 上进行了仔细查看,但没有发现与此问题相关的任何内容。

谢谢大家

编辑: 对于将来遇到这种情况的任何人,我对 Yakiv 的方法做了一个稍微修改的版本,并得出了这个结论:

for (int i = 0; i < views.size(); i++) {
        View currentView = views.get(i);
        if (currentView instanceof CheckBox) {
            outState.putBoolean("VIEW"+i, (((CheckBox) currentView).isChecked()));
        } else if (currentView instanceof EditText) {
            outState.putString("VIEW"+i, ((EditText) currentView).getText().toString());
        } else if (currentView instanceof Spinner) {
            //.....etc. etc.
        }
    }

再次感谢 Yakiv 的好主意。

4

1 回答 1

0

要恢复动态视图状态,您需要将它们设置为class fields并将它们初始化为onCreate. 然后只需使用这篇文章来保存和恢复它们的状态。

private List<View> mViews= new ArrayList<View>();

@Override
public void onCreate(..)
{
  LinearLayout parent = ....//initialize it here
  initializeViews();
}

public void initializeViews()
{
  // create and add 10 (or what ever you need) views to the list here
  mViews.add(new View(this));
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);

  int mViewsCount = 0;
  for(View view : mViews)
  {
     savedInstanceState.putInt("mViewId_" + mViewsCount, view.getId());
     mViewsCount++;
  }

  savedInstanceState.putInt("mViewsCount", mViewsCount);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);

  int mViewsCount = savedInstanceState.getInt("mViewsCount");;
  for(i = 0; i <= mViewsCount)
  {
     View view = mViews.get(i);

     int viewId = savedInstanceState.getInt("mViewId_" + i);
     view.setId(viewId);

     mViewsCount++;
  }
}

最好的祝愿。

于 2013-10-25T10:29:38.790 回答