如何在没有重新启动活动的情况下在android中应用主题/样式?

时间:2016-06-14 22:34:58

标签: android

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

我知道每次选择主题时我都可以调用recreate(),但我想知道在不重新创建整个活动的情况下是否存在更好的解决方案。

以下是目前工作原理的视频: 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;


        }
    });
  }

在我的PreferenceActivity setTheme();方法

中调用方法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;
    }
}

4 个答案:

答案 0 :(得分:6)

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

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

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

在我的PreferenceActivity onCreate();中,我调用了在调用setTheme();后调用的自定义方法recreate();setTheme();只会从SharedPreference中查找OnPreferenceChangeListener中保存的内容,并将主题设置为相应的值

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

答案 1 :(得分:0)

你不能。 您可以开始一个新活动来选择主题,以及用户何时选择完成该活动。

答案 2 :(得分:0)

触发布局更新(通过旋转设备,或让应用程序认为它已旋转)通常应该使其重新加载其资源。

我现在还不记得到底是怎么做的,但这是我上次调查如何做类似事情的常见做法。 只记得指定(在清单中?)您的活动将处理布局更改/屏幕旋转以避免完全重启(以及丢失任何未保存的数据)。

答案 3 :(得分:0)

看起来有一个名为invalidate()的方法要在需要重绘的视图上调用。

Link

这应该允许您调用仅需要重绘的单个视图。不是整个活动。

相关问题