我可以成功在onCreate上交换主题。
protected void onCreate(Bundle savedInstanceState) {
//Read from database and get theme
...........
if ( setup.getSelectedTheme() == Setup.SelectedTheme.SELECTED_THEME_DARK ) {
setTheme(R.style.DarkTheme);
} else {
setTheme(R.style.AppTheme);
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
我还有一个launch_screen.xml
,仅在启动时显示。
launch_screen.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Splash Screen Background (Color/Image) -->
<item android:drawable="?attr/colorSelectedBackgroundColor" />
</layer-list>
styles.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorSelectedBackgroundColor">#ffffff</item>
</style>
<style name="DarkTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorSelectedBackgroundColor">#000000</item>
</style>
</resources>
colorSelectedBackgroundColor
在AppTheme
处为白色,在DarkTheme
处为黑色。我希望根据所选主题在开始时屏幕是黑色还是白色。但是此代码不起作用。
我该怎么办?
答案 0 :(得分:0)
您可以在styles.xml中创建自己的DarkTheme和WhiteTheme版本:
<style name="DarkTheme" parent="AppTheme">
<item name="android:windowBackground">@color/black</item>
</style>
<style name="WhiteTheme" parent="AppTheme">
<item name="android:windowBackground">@color/black</item>
</style>
然后在您的代码中使用它:
if ( setup.getSelectedTheme() == Setup.SelectedTheme.SELECTED_THEME_DARK ) {
setTheme(R.style.DarkTheme);
} else {
setTheme(R.style.WhiteTheme);
}
祝你好运!
编辑1:
您还可以仅创建两个版本的launch_screen.xml。一个是launch_screen_white.xml,另一个是launch_screen_black.xml。
launch_screen_white.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Splash Screen Background (Color/Image) -->
<item "android:windowBackground">@color/white</item>
</layer-list>
launch_screen_black.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Splash Screen Background (Color/Image) -->
<item "android:windowBackground">@color/black</item>
</layer-list>
然后根据
来更改父视图的背景 if ( setup.getSelectedTheme() == Setup.SelectedTheme.SELECTED_THEME_DARK )
答案 1 :(得分:0)
这可能不是您期望的答案,但是不幸的是,主题切换发生在应用程序启动后大约一秒钟,并且您无能为力。主题更改之前总会有闪光。
但是,如果只想在浅色和深色主题之间切换,则可以将Theme.AppCompat.DayNight
用作浅色和深色主题的父项,并添加没有自定义背景的主题作为主要主题。
<resources>
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
</style>
<style name="Light" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="colorSelectedBackgroundColor">#ffffff</item>
</style>
<style name="DarkTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="colorSelectedBackgroundColor">#000000</item>
</style>
</resources>
因此,主题交换将通过以下方式以编程方式完成:
if(setup.getSelectedTheme() == Setup.SelectedTheme.SELECTED_THEME_DARK) {
setTheme(R.style.DarkTheme);
} else {
setTheme(R.style.LightTheme);
}
但是,根据系统设置而不是应用程序的设置来选择亮和暗主题。
请注意,深色主题的背景色不等于#00000000
,而是深灰色。但是,闪光不会那么烦人。
答案 2 :(得分:0)
已经快 2 年了,但你走了。
在加载 activity_main 之前有一个空的 Activity。
在 com.example.MyApplication(MainActivity.kt 所在的位置)中创建一个类文件
DarkThemeActivity.kt
class DarkThemeApplication : Application() {
private val mainPrefInstance by lazy { getSharedPreferences("main", Context.MODE_PRIVATE) }
override fun onCreate() {
super.onCreate()
val themePref = mainPrefInstance.getString("Theme", ThemeHelper.DEFAULT_MODE)!!
ThemeHelper.applyTheme(themePref)
// I'm using shared preference to save my theme but you can replace
// the last two lines with however you want to set theme
}
}
AndroidManifest.xml
<application
android:name=".DarkThemeApplication"
.
.
<activity android:name=".MainActivity"/>
</application>
这将加载主题,以便在启动画面中也使用正确的主题。
注意:如果您想知道 ThemeHelper
是如何实现的,请看这里。
object ThemeHelper {
const val LIGHT_MODE = "light"
const val DARK_MODE = "dark"
const val DEFAULT_MODE = "default"
fun applyTheme(themePref: String, isDarkThemeOn: Boolean = false) {
when (themePref) {
LIGHT_MODE -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
DARK_MODE -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
DEFAULT_MODE -> {
if (isDarkThemeOn) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
}
}
}
}
在 Android's Github page (android/user-interface-samples) 中有一个演示应用程序