【问题标题】:setTheme() not completely overriding manifest application themesetTheme() 没有完全覆盖清单应用程序主题
【发布时间】:2015-04-13 14:55:34
【问题描述】:

我设置了两个不同的主题,一个扩展Theme.AppCompat,另一个扩展Theme.AppCompat.Light

<style name="MyTheme" parent="Theme.AppCompat"></style>
<style name="MyTheme.Light" parent="Theme.AppCompat.Light"></style>

在我的 Manifest 文件中,我放置了以下两者之一:

<application
    android:theme="@style/MyTheme.Light">

但是我希望用户能够在主题之间切换,所以我在我的活动的onCreate() 方法中覆盖了这个参数:我从SharedPreferences 检索要设置的主题,然后设置它setTheme(int id):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    loadTheme();
    setContentView(R.layout.a_main);
}

public void loadTheme() {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    String key = "theme";
    String theme = prefs.getString(key, getDefault(key));
    if (theme.equals("dark")) {
        setTheme(R.style.MyTheme);
    } else { setTheme(R.style.MyTheme_Light); }
}

这可能适用于所有主题值,除了背景颜色(应该是android:windowBackground)。该颜色值不受我的setTheme() 调用的影响,并且保持我放在清单文件中的值。

即,如果我设置@style/MyTheme.Light,无论我如何处理setTheme(),背景都将始终为白色。同样,如果我在清单中设置@style/MyTheme,我的背景将保持黑暗。 为什么会这样,我该怎么办?

【问题讨论】:

    标签: android android-manifest android-theme


    【解决方案1】:

    如果您的备用主题包含对 Window 的更改,您需要先致电 setTheme,然后再致电 super.onCreate(..)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        loadTheme();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.a_main);
    }
    
    public void loadTheme() {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        String key = "theme";
        String theme = prefs.getString(key, getDefault(key));
        if (theme.equals("dark")) {
            setTheme(R.style.MyTheme);
        } else { setTheme(R.style.MyTheme_Light); }
    }
    

    【讨论】:

    • 删除我的答案,因为我同意你的。
    • 我没有时间测试这个,接下来的几天也没有,但它看起来很合理。谢谢。
    • 实现深色主题的好方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2020-03-28
    相关资源
    最近更新 更多