我正在尝试在一个活动中保存我的视图状态,并使用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。
对于我似乎做错的任何帮助都将不胜感激。感谢
答案 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);
}
另一方面,您似乎希望采用更加自动化的方法。我不相信你可以任意传递意见,因为它们不是可序列化的,尽管我可能弄错了。