首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Android运行时更改当前主题

如何在Android运行时更改当前主题
EN

Stack Overflow用户
提问于 2010-03-20 19:36:41
回答 12查看 202.1K关注 0票数 163

我已经创建了一个PreferenceActivity,它允许用户选择他想要应用于整个应用程序的主题。

当用户选择一个主题时,将执行以下代码:

代码语言:javascript
复制
if (...) {
    getApplication().setTheme(R.style.BlackTheme);
} else {
    getApplication().setTheme(R.style.LightTheme);
}

但是,即使我检查了调试器是否正在执行代码,我也看不到用户界面有任何变化。

主题是在res/values/styles.xml中定义的,并且不显示任何错误。

代码语言:javascript
复制
<resources>
    <style name="LightTheme" parent="@android:style/Theme.Light">
    </style>

    <style name="BlackTheme" parent="@android:style/Theme.Black">
    </style>    
</resources>

你知道可能会发生什么以及如何修复它吗?我应该在代码中的任何特定点调用setTheme吗?如果有帮助的话,我的应用程序由几个活动组成。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2010-03-20 20:35:42

我也希望看到这个方法,在这个方法中,您可以为所有活动设置一次。但据我所知,在显示任何视图之前,您必须在每个活动中进行设置。

作为参考,请查看以下内容:

http://www.anddev.org/applying_a_theme_to_your_application-t817.html

编辑(从该论坛复制):

代码语言:javascript
复制
    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,您的主题将会设置,并且活动将不再重新创建

代码语言:javascript
复制
  protected void onCreate(Bundle savedInstanceState) {
     setTheme(android.R.style.Theme_Dark);
     super.onCreate(savedInstanceState);


    // ...
    setContentView(R.layout.main);
}
票数 96
EN

Stack Overflow用户

发布于 2013-01-17 04:28:34

如果你想改变一个已经存在的活动的主题,在setTheme()之后调用recreate()

注意:如果在onCreate()中更改主题,请不要调用recreate,以避免无限循环。

票数 67
EN

Stack Overflow用户

发布于 2015-03-02 05:11:01

recreate() (正如TPReal提到的)将只重新启动当前的活动,但之前的活动仍将在后台堆栈中,主题将不会应用于它们。

因此,这个问题的另一个解决方案是完全重新创建任务堆栈,如下所示:

代码语言:javascript
复制
    TaskStackBuilder.create(getActivity())
            .addNextIntent(new Intent(getActivity(), MainActivity.class))
            .addNextIntent(getActivity().getIntent())
            .startActivities();

编辑:

只需将上面的代码放在你在UI或其他地方执行主题更改后。您的所有活动都应该在onCreate()之前调用方法setTheme(),可能是在某些父活动中。存储在SharedPreferences中选择的主题,读取它,然后使用setTheme()方法设置,这也是一种正常的方法。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2482848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档