更改主题不会影响启动屏幕

时间:2019-07-18 13:08:37

标签: android xml

我可以成功在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>

colorSelectedBackgroundColorAppTheme处为白色,在DarkTheme处为黑色。我希望根据所选主题在开始时屏幕是黑色还是白色。但是此代码不起作用。

我该怎么办?

3 个答案:

答案 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) 中有一个演示应用程序