setTheme()不会完全覆盖清单应用程序主题

时间:2015-04-13 14:55:34

标签: android android-manifest android-theme

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

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

在我的清单文件中,我放了两个中的一个:

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

但是我希望用户能够在主题之间切换,所以我在我的活动的onCreate()方法中覆盖了这个参数:我从SharedPreference s中检索要设置的主题,然后使用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,我的背景将保持黑暗。 为什么,我该怎么办?

1 个答案:

答案 0 :(得分:1)

如果您的备用主题包含对窗口的更改,则您需要在致电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); }
}
相关问题