重启活动,例如方向改变

时间:2013-07-17 16:50:27

标签: android android-layout android-activity

我希望我的应用支持右手和左手用户的不同布局。因此,在更改相应的首选项后,我想以与重新启动时相同的方式重新启动活动。方向变化。

到目前为止我尝试了什么:

1

Intent intent = getIntent();
finish();
startActivity(intent);

这不存储和加载已保存的实例状态

2

View cv = findViewById(android.R.id.content);

SparseArray<Parcelable> state = new SparseArray<Parcelable>();
cv.saveHierarchyState(state);
setContentView(desiredCv);

cv = findViewById(android.R.id.content);
cv.restoreHierarchyState(state);

即便如此,许多事情也不应该如此。

我认为最终我可以弄清楚如何在不重新启动的情况下正确更改布局,但以与系统定义的配置更改相同的方式更容易实现。

2 个答案:

答案 0 :(得分:1)

您可以使用Fragments并以编程方式执行此操作。按照相同的方式,您也可以在UI中重新排列元素,但我认为维护它会很复杂。

未完成的活动不会调用

OnSaveInstanceState()。而且我不知道如何让Android为您处理这个问题。

解决方案可能是创建2个不同的布局文件。然后,您根据已更新的首选项值以编程方式在onCreate()方法中选择正确的。

如果您的两个布局对需要还原的视图使用相同的ID,则可以实现两种方法,将这些状态保存在Bundle中,并从Bundle中检索这些状态。如果要更改布局,请使用正确的意图启动新活动(告诉活动要加载哪个布局);在与此意图关联的捆绑包中保存您需要的内容并在onCreate()中检索它以更新视图。在使用布局dx或sx的情况下,您不需要复制代码;您可以使用相同的代码,因为这两个布局使用相同的ID。

通过这种方式,您仍然可以进行一项活动,并可以重复使用您的代码。用于恢复布局更改之间状态的相同代码仍可与onSaveInstanceState()onRestoreInstanceState()一起使用,因为ids也是相同的。

要简短,请使用捆绑包。

答案 1 :(得分:1)

如果您使用的是API级别11或更高级别(Android 3.0或更高版本),则可以在活动中调用recreate()。这将破坏当前实例并创建一个新实例,并且应该在配置更改期间执行相同的操作(即将调用onSaveInstanceState()等)。