我希望我的应用支持右手和左手用户的不同布局。因此,在更改相应的首选项后,我想以与重新启动时相同的方式重新启动活动。方向变化。
到目前为止我尝试了什么:
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);
即便如此,许多事情也不应该如此。
我认为最终我可以弄清楚如何在不重新启动的情况下正确更改布局,但以与系统定义的配置更改相同的方式更容易实现。
答案 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()
等)。