共享首选项 - 颜色、色调和可见性

Shared Preferences - Color, Tint and Visibility

我有一个布局可以更改 dark/light 模式功能的背景颜色、色调列表和文本颜色。

只有两个设置 (dark/light),主题中使用的颜色在我的代码顶部引用如下:

    int orangeTheme = Color.rgb(253,135,0);
    int blueTheme = Color.rgb(0,0,254);
    int whiteTheme = Color.rgb(213,214,214);
    int blackTheme = Color.rgb(0,0,0);

这样设置:(深色模式)

gridLayout.setBackgroundColor(blackTheme);

buttonA.setBackgroundTintList(ColorStateList.valueOf(blueTheme));
buttonA.setTextColor(blackTheme);

buttonB.setBackgroundTintList(ColorStateList.valueOf(orangeTheme));
buttonB.setTextColor(blackTheme);

seekBar.setProgressTintList(ColorStateList.valueOf(blueTheme));
seekBar.setThumbTintList(ColorStateList.valueOf(blueTheme));

并像这样还原:(浅色模式)

gridLayout.setBackgroundColor(orangeTheme);

buttonA.setBackgroundTintList(ColorStateList.valueOf(blackTheme));
buttonA.setTextColor(ColorStateList.valueOf(whiteTheme));

buttonB.setBackgroundTintList(ColorStateList.valueOf(blueTheme));
buttonB.setTextColor(ColorStateList.valueOf(orangeTheme));

seekBar.setProgressTintList(ColorStateList.valueOf(blackTheme));
seekBar.setThumbTintList(ColorStateList.valueOf(blackTheme));

使用共享首选项,如何保存和加载这些值?

public void saveData() {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        editor.apply();
        Toast.makeText(FavouriteActivity.this, "Data saved", Toast.LENGTH_SHORT).show();
    }

public void loadData() {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS,MODE_PRIVATE);

        Toast.makeText(FavouriteActivity.this, "Data loaded", Toast.LENGTH_SHORT).show();
    }

public void updateViews() {

        Toast.makeText(FavouriteActivity.this, "Views updated" , Toast.LENGTH_SHORT).show();
    }

我对 Android 和 Java 以及我所见过的所有保存状态教程的处理文本视图内容或开关位置的经验很少,仅此而已。这就是我问的原因 - 我仍然不确定如何保存或引用大部分内容,但现在我主要关注以下内容:

如何在共享首选项 save/load 函数中引用和检索这些方面?

有没有更好的方法来保存和加载这些方面?

感谢所有帮助。

我的回答是:您不应该手动执行此操作。相反,创建两个资源文件(这些组件的样式文件),然后使用 AppCompatDelegate.setDefaultNightMode

看看这个:

setDefaultNightMode added in version 24.1.0

void setDefaultNightMode (int mode)

Sets the default night mode. This is used across all activities/dialogs but can be overridden locally via setLocalNightMode(int).

This method only takes effect for those situations where applyDayNight() works. Defaults to MODE_NIGHT_NO.

This only takes effect for components which are created after the call. Any components which are already open will not be updated.

它采用以下值之一:

MODE_NIGHT_NO. Always use the day (light) theme.

MODE_NIGHT_YES. Always use the night (dark) theme.

MODE_NIGHT_FOLLOW_SYSTEM (default). This setting follows the system’s setting, which on Android Q and above is a system setting (more on this below).

(您可以通过检查保存在共享首选项中的值来应用其中之一,如您的示例所示)

更多信息:

https://developer.android.com/reference/android/support/v7/app/AppCompatDelegate.html#setDefaultNightMode(int)

https://medium.com/androiddevelopers/appcompat-v23-2-daynight-d10f90c83e94

Day/Night theme for android app