如何恢复Android View(UI)的状态?

时间:2011-08-20 18:18:32

标签: android

我正在尝试在一个活动中保存我的视图状态,并使用Bundle将其传递给另一个活动。在第二个活动中,我尝试使用bundle恢复视图状态。

第一项活动

private View CreateView() {
ScrollView scrollView = new ScrollView(this);
final LinearLayout layout = new LinearLayout(this);
layout.setOrientation(android.widget.LinearLayout.VERTICAL);
scrollView.addView(layout);         
Button btn = new Button(this);
btn.setId(100);
btn.setText("Button Text");
btn.setOnClickListener(new ClickListener());
layout.addView(btn);
return scrollView;
}

的onCreate

super.onCreate(savedInstanceState);
View v = CreateView();
setContentView(v);

保存状态

SparseArray<Parcelable> array = new SparseArray<Parcelable>();
view.saveHierarchyState(array);
Bundle bundle = new Bundle();
bundle.putSparseParcelableArray("state", array);
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtras(bundle);
startActivity(intent);

第二项活动onCreate

bundle = this.getIntent().getExtras();        
View view = new View(this);
view.restoreHierarchyState(bundle.getSparseParcelableArray("state"));
setContentView(view.getRootView());   
Button btn = (Button)findViewById(100);

一切都有效,没有例外。但是,我面临两个问题: 1.第二项活动中的视图为空白。虽然我已经恢复了保存状态但我看不到任何东西 2.第二个活动中按钮(ID为100)的实例始终为空

调试时,我可以看到捆绑包中的一个值为id <100。

对于我似乎做错的任何帮助都将不胜感激。感谢

4 个答案:

答案 0 :(得分:2)

我发现无法在最初创建(或渲染)的不同活动中恢复视图。由于View不是可序列化类型,因此也无法完整发送。此时似乎没有任何解决方案(我没有探索修改Android源代码的选项)

答案 1 :(得分:1)

为什么要以编程方式创建 View 并将其发送到其他活动?您可以在两个活动中简单地使用相同的布局,然后只传递支持视图的数据。那也比使用parcelable更方便吗?

你能详细说明你想在这里实现的目标吗?也许我们可以给你一个更好的回应......

答案 2 :(得分:0)

您是否尝试在onSavedInstanceState(...)中执行此操作?

来自Android文档:

  在放入活动之前调用

onSaveInstanceState(Bundle)   这样的背景状态,可以让你省去任何动态   实例状态在您的活动中进入给定的Bundle,稍后   收到onCreate(Bundle)

答案 3 :(得分:0)

我采用的唯一方法是使用onSaveInstanceState和onRestoreInstanceState。

public void onSaveInstanceState(Bundle outState){
    //save the state of the sign up views!
    Serializable page0fields = sign_in_page.getFields();
    outState.putSerializable("page0fields", page0fields);
    super.onSaveInstanceState(outState);    
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
    //restore the state of the sign up views!
    sign_in_page.fillFields(
            savedInstanceState.getSerializable("page0fields")
            );
    super.onRestoreInstanceState(savedInstanceState);
}

另一方面,您似乎希望采用更加自动化的方法。我不相信你可以任意传递意见,因为它们不是可序列化的,尽管我可能弄错了。