-1

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

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

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);

即便如此,很多事情都不是应有的样子。

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

4

2 回答 2

1

如果您使用 API 级别 11 或更高版本(Android 3.0 或更高版本),则可以调用recreate()您的活动。这将破坏当前实例并创建一个新实例,并且应该做与配置更改期间发生的事情相同的事情(onSaveInstanceState()即将被调用等)。

于 2013-07-18T12:45:14.333 回答
1

您可以使用Fragments并以编程方式进行操作。按照同样的方式,您还可以在 UI 中动态地重新排列您的元素,但我认为维护起来会很复杂。

OnSaveInstanceState()不会在正在完成的 Activity 上调用。而且我不知道有一种方法可以让 Android 为您处理这个问题。

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

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

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

为了简短起见,请使用捆绑包。

于 2013-07-18T05:34:31.920 回答