我已经创建了一个PreferenceActivity,它允许用户选择他想要应用于整个应用程序的主题。
当用户选择一个主题时,将执行以下代码:
if (...) {
getApplication().setTheme(R.style.BlackTheme);
} else {
getApplication().setTheme(R.style.LightTheme);
}
但是,即使我检查了调试器是否正在执行代码,我也看不到用户界面有任何变化。
主题是在res/values/styles.xml
中定义的,并且不显示任何错误。
<resources>
<style name="LightTheme" parent="@android:style/Theme.Light">
</style>
<style name="BlackTheme" parent="@android:style/Theme.Black">
</style>
</resources>
你知道可能会发生什么以及如何修复它吗?我应该在代码中的任何特定点调用setTheme
吗?如果有帮助的话,我的应用程序由几个活动组成。
发布于 2010-03-20 20:35:42
我也希望看到这个方法,在这个方法中,您可以为所有活动设置一次。但据我所知,在显示任何视图之前,您必须在每个活动中进行设置。
作为参考,请查看以下内容:
http://www.anddev.org/applying_a_theme_to_your_application-t817.html
编辑(从该论坛复制):
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Call setTheme before creation of any(!) View.
setTheme(android.R.style.Theme_Dark);
// ...
setContentView(R.layout.main);
}
编辑
如果您在super.onCreate(savedInstanceState);
之后调用setTheme
,您的活动将重新创建,但如果您在super.onCreate(savedInstanceState);
之前调用setTheme
,您的主题将会设置,并且活动将不再重新创建
protected void onCreate(Bundle savedInstanceState) {
setTheme(android.R.style.Theme_Dark);
super.onCreate(savedInstanceState);
// ...
setContentView(R.layout.main);
}
发布于 2013-01-17 04:28:34
如果你想改变一个已经存在的活动的主题,在setTheme()
之后调用recreate()
。
注意:如果在onCreate()
中更改主题,请不要调用recreate,以避免无限循环。
发布于 2015-03-02 05:11:01
recreate()
(正如TPReal提到的)将只重新启动当前的活动,但之前的活动仍将在后台堆栈中,主题将不会应用于它们。
因此,这个问题的另一个解决方案是完全重新创建任务堆栈,如下所示:
TaskStackBuilder.create(getActivity())
.addNextIntent(new Intent(getActivity(), MainActivity.class))
.addNextIntent(getActivity().getIntent())
.startActivities();
编辑:
只需将上面的代码放在你在UI或其他地方执行主题更改后。您的所有活动都应该在onCreate()
之前调用方法setTheme()
,可能是在某些父活动中。存储在SharedPreferences
中选择的主题,读取它,然后使用setTheme()
方法设置,这也是一种正常的方法。
https://stackoverflow.com/questions/2482848
复制相似问题