在动态创建的UI中保存和恢复实例状态?

时间:2013-10-25 10:18:56

标签: android dynamic save state restore

我正在创建一个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提供了很棒的想法。

1 个答案:

答案 0 :(得分:0)

要恢复动态视图状态,您需要将其设为class fields并在onCreate中对其进行初始化。然后使用this文章保存并恢复其状态。

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++;
  }
}

祝福。