2013-10-25 52 views
1

我正在创建一个由静态视图和动态创建视图组成的活动组成的Android应用程序。该活动包含保存在XML文件中的UI元素以及基于模型类的内容动态创建的UI元素。 (因为在我的模型类中有一个数组,并且将为数组中的每个元素创建一个EditText ..并且将创建包含不同阵列中的每个元素的微调器)在动态创建的UI中保存和恢复实例状态?

通常的保存方法是什么并在涉及动态创建的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为了真棒的想法。

+0

你在搜索时很糟糕,这里有一个答案 - http://stackoverflow.com/questions/151777/saving-activity-state-in-android。 –

+0

谢谢您的链接,但正如我对Yakiv的评论回复的,这是最简单的情况,您可以知道您拥有哪些UI元素,并且可以轻松地将它们存储在捆绑包中。我不知道我有哪些UI元素,因为它们是动态生成的。该活动可能有5个编辑文本,也可能有50个,这使得难以将这些值添加到包中。 – user2459186

回答

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

祝好。

+0

感谢您的回复。我有点困惑,但问题是,可能有5 EditTexts在我的活动或可能有50 ..所以在'onSaveInstanceState'我没有办法将值添加到捆绑,因为不会有一个独特的'钥匙'(如'dogColour'或'dogName',如果有意义的话) – user2459186

+0

已更新的答案。 –

+0

这实际上是一个非常好的解决方案,非常感谢您的帮助!如果我遇到任何问题,我会报告回来 – user2459186