[英]How to restore state of an Android View (UI)?
我正在尝试将我的视图状态保存在一个活动中,然后使用捆绑包将其传递给另一个活动。 在第二个活动中,我尝试使用捆绑包还原视图状态。
第一次活动
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)的实例始终为null
进行调试时,我可以看到捆绑包中的ID为100的值之一
对于我似乎做错了的任何帮助,将不胜感激。 谢谢
我发现不可能在与最初创建(或呈现)不同的活动中还原视图。 由于View不是可序列化的类型,因此也无法完整发送。 在这一点上似乎没有任何解决方案(我还没有探索修改Android源代码的选项)
为什么要尝试以编程方式创建视图并将其发送到另一个活动? 您可以在两个活动中简单地使用相同的布局,然后仅传递支持视图的数据。 那还有比使用包裹包裹更方便的方法吗?
您能否详细说明您要在这里实现的目标? 也许我们可以给您更好的答复。
您是否尝试过在onSavedInstanceState(...)中执行此操作 ?
从Android
文档中:
在将活动置于这样的背景状态之前,将调用onSaveInstanceState(Bundle),以使您可以将活动中的任何动态实例状态保存到给定的Bundle中,以便稍后在onCreate(Bundle)中接收
我采用的唯一方法是使用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);
}
另一方面,您似乎希望采用一种更加自动化的方法。 我不认为您可以随意传递视图,因为它们不可序列化,尽管我可能会误会。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.