android - 如何在不重新启动 Activity 的情况下在android中应用主题/样式?

标签 android

我有一个应用程序,用户可以从 PreferenceActivity 中选择几个不同颜色的主题,从而更改整个应用程序的主题/颜色。但在 PreferenceActivity 中选择的更改不会立即应用。仅当用户重新输入 PreferenceActivity 时才会应用更改。

我知道我可以在每次选择主题时调用 recreate(),但我想知道是否存在更好的解决方案而无需重新创建整个 Activity 。

这是一段视频,展示了它目前是如何工作的: https://www.youtube.com/watch?v=oU8xIUi_48A

这是我在我的 PreferenceActivity 中设置从 preferenceList 中选择的值的地方:

@Override
public void onCreate(Bundle savedInstanceState) {
    setTheme();
    themecolorList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            switch (themecolorList.getValue()) {

                case "grey":
                    themecolorList.getEditor().putString("grey", "green").apply();
                    break;
                case "green":
                    themecolorList.getEditor().putString("green", "green").apply();
                    setTheme(R.style.AppTheme_default);
                    break;
                case "blue":
                    themecolorList.getEditor().putString("blue", "green").apply();
                    break;
                case "yellow":
                    themecolorList.getEditor().putString("yellow", "green").apply();
                    break;
                case "red":
                    themecolorList.getEditor().putString("red", "green").apply();
                    break;
                case "pink":
                    themecolorList.getEditor().putString("pink", "green").apply();
                    break;

                default:
                    themecolorList.getEditor().putString("green", "green").apply();
                    break;
            }

            recreate();
            return true;


        }
    });
  }

方法 setTheme(); 在我的 PreferenceActivitys onCreate(); 方法中被调用

private void setTheme() {

   SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    switch (sharedPreferences.getString("THEME_KEY", "green")) {

        case "grey":
            setTheme(R.style.AppTheme_Grey);
            break;

        case "green":
            setTheme(R.style.AppTheme_default);
            break;

        case "blue":
            setTheme(R.style.AppTheme_Blue);
            break;

        case "yellow":
            setTheme(R.style.AppTheme_Yellow);
            break;

        case "red":
            setTheme(R.style.AppTheme_Red);
            break;

        case "pink":
            setTheme(R.style.AppTheme_Pink);
            break;

        default:
            getApplication().setTheme(R.style.AppTheme_default);
            setTheme(R.style.AppTheme_default);
            break;
    }
}

最佳答案

似乎最好的解决方案是使用recreate();因为没有其他方法可以刷新 Activity 的整个布局:

每次用户按下主题列表中的选项时 按下的键/值通过 OnPreferenceChangeListener 保存在 SharedPreference 中,然后调用 recreate();

themecolorList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            recreate();
            return true;
        }
    });

在我的 PreferenceActivityonCreate(); 中,我调用了一个自定义方法 setTheme();,它在 recreate 之后调用(); 被调用。 setTheme(); 只是从 OnPreferenceChangeListener 中查找保存在 SharedPreference 中的内容,并将主题设置为相应的值

 @Override
 public void onCreate(Bundle savedInstanceState) {
    setTheme();
    super.onCreate(savedInstanceState);
}

关于android - 如何在不重新启动 Activity 的情况下在android中应用主题/样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37823231/

相关文章:

android - Gson 在单个 JSON 对象中使用两种列表类型进行序列化

android - 应用程序被杀死时的 GCM 推送通知 Android Pre lollipop

Android Google Map v2 - 单击标记信息窗口时启动 Activity

java - 限制增减整数

安卓下拉列表

java - 停止窃取 ListView 焦点的按钮

android - 错误:具有配置 ' '的attr/style的值重复

java - 我无法将 Edittext Multiline 插入服务器

android - 备份和恢复数据库android studio

android - 移动相机位置以适应关于标记高度的 LatLngBounds