这个问题在这里已有答案:
我创建了一个PreferenceActivity,允许用户选择他想要应用于整个应用程序的主题 .
当用户选择主题时,执行以下代码:
if (...) {
getApplication().setTheme(R.style.BlackTheme);
} else {
getApplication().setTheme(R.style.LightTheme);
}
但是,即使我已经使用调试器检查了代码是否正在执行,我也看不到用户界面的任何变化 .
主题在 res/values/styles.xml
中定义,Eclipse不显示任何错误 .
<resources>
<style name="LightTheme" parent="@android:style/Theme.Light">
</style>
<style name="BlackTheme" parent="@android:style/Theme.Black">
</style>
</resources>
关于可能发生的事情以及如何解决问题的任何想法?我应该在代码中的任何特殊位置调用 setTheme
吗?如果有帮助,我的应用程序包含几个活动 .
13 回答
我也希望看到这个方法,你可以为你的所有活动设置一次 . 但据我所知,你必须在显示任何观点之前设置每个活动 .
供参考检查:
http://www.anddev.org/applying_a_theme_to_your_application-t817.html
编辑(从该论坛复制):
如果要更改现有活动的主题,请在setTheme()之后调用recreate() .
注意:如果在
onCreate()
中更改主题,请不要调用recreate,以避免无限循环 .recreate()
(如TPReal所述)将仅重新启动当前活动,但之前的活动仍将在后台堆栈中,并且主题将不会应用于它们 .因此,此问题的另一个解决方案是完全重新创建任务堆栈,如下所示:
编辑:
在UI或其他地方执行主题更改后,只需输入上面的代码即可 . 您的所有活动都应该在
onCreate()
之前调用方法setTheme()
,可能在某些父活动中 . 这也是存储在SharedPreferences
中选择的主题,读取它然后使用setTheme()
方法设置的常规方法 .我遇到了同样的问题,但我找到了解决方案 .
我有类似的问题,我这样解决了..
此代码用于重新创建活动保存包并更改主题 . 你必须编写自己的onSaveInstanceState(Bundle outState);从API-11开始,您可以使用recreate()方法
我们必须在调用 'super.onCreate()' 和 'setContentView()' 方法之前设置主题 .
查看此link,以便在运行时将新主题应用于整个应用程序 .
代替
使用
我的代码:在onCreate()方法中:
某处(例如,点击按钮):
你必须重新创建活动,否则 - 不会发生变化
这就是我为Material Design创建的 . 愿它对你有所帮助 .
看看MultipleThemeMaterialDesign
我知道我迟到但我想在这里发布一个解决方案:检查完整的源代码here . 这是我在使用首选项更改主题时使用的代码 .
这种方式对我有用:
然后你想要改变一个新主题:
您可以完成Acivity并在之后重新创建它,这样您的活动将再次创建,所有视图将使用新主题创建 .
在setTheme()之后调用SetContentView(Resource.Layout.Main) .
这对我没有影响:
但这有效: