繁体   English   中英

如何还原Android View(UI)的状态?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM