setTheme() 没有完全覆盖清单应用程序主题
setTheme() not completely overriding manifest application theme
我设置了两个不同的主题,一个扩展 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">
但是我希望用户能够在主题之间切换,所以我在 activity 的 onCreate()
方法中覆盖了这个参数:我从 [=16 检索要设置的主题=]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
,我的背景将保持黑暗。
为什么会这样,我该怎么办?
如果您的备用主题包括对 Window 的更改,您需要在调用 super.onCreate(..)
之前调用 setTheme
:
@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); }
}
我设置了两个不同的主题,一个扩展 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">
但是我希望用户能够在主题之间切换,所以我在 activity 的 onCreate()
方法中覆盖了这个参数:我从 [=16 检索要设置的主题=]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
,我的背景将保持黑暗。
为什么会这样,我该怎么办?
如果您的备用主题包括对 Window 的更改,您需要在调用 super.onCreate(..)
之前调用 setTheme
:
@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); }
}