刷新设置片段以合并黑暗模式 [英] Refreshing Settings Fragment to Incorporate Dark Mode

查看:92
本文介绍了刷新设置片段以合并黑暗模式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序,其中我使用AppCompatDelegate和values-night.xml以编程方式在应用程序内切换到Dark主题.我有一个带有SettingsFragment的SettingsActivity.java,在其中设置了一个OnSharedPreferenceChangeListener来监听相应的SharedPreferences值.在设置"页面中,我包括了暗"模式设置.但是,在切换设置时,暗模式不会自动打开.相反,我必须退出SettingsActivity才能使应用更改模式.这是我的代码:

I have an app in which I use AppCompatDelegate and values-night.xml to switch to a Dark theme in-app programatically. I have a SettingsActivity.java with a SettingsFragment, where I have set an OnSharedPreferenceChangeListener to listen to the respective SharedPreferences values. In the Settings page, I have included a Dark mode setting. On toggling the setting, however, the dark mode does not automatically turn on; instead, I have to exit the SettingsActivity for the app to change mode. Here is my code:

SettingsActivity.java

    public class SettingsActivity extends AppCompatActivity {

    private Toolbar toolbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        toolbar = findViewById(R.id.toolbar_settings);
        setSupportActionBar(toolbar);

        if (findViewById(R.id.fragment_container)!=null) {
            if (savedInstanceState!=null) {
                return;
            }
            getFragmentManager().beginTransaction().add(R.id.fragment_container, new SettingsFragment()).commit();
        }

        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(SettingsActivity.this, MainActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.settings_menu, menu);
        return true;
    }

    public void savePrefs () {
        SharedPreferences sharedPreferences = getSharedPreferences("Shared_Preferences", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

    }
}

SettingsFragment.java

public class SettingsFragment extends PreferenceFragment {

    public int currTheme;
    public static final String theme = "theme";
    private SharedPreferences.OnSharedPreferenceChangeListener listener;
    private ViewGroup parent;
    private View currView;
    @Override
    public void onCreate(@Nullable Bundle SavedInstanceState) {
        super.onCreate(SavedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
                Preference preference = findPreference(s);
                if (s.equals(theme)) {
                    currTheme = Integer.valueOf(sharedPreferences.getString(s, "0"));
                    switch (currTheme) {
                        case 2 :
                            preference.setSummary("Dark");
                            break;
                        case 1 :
                            preference.setSummary("Light");
                            break;
                        default:
                            preference.setSummary("System Settings");
                    }
                    preference.setTitle("Theme");
                } ... 
            }
        };
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = super.onCreateView(inflater, container, savedInstanceState);
        parent = container;
        currView = view;        
        view.setBackgroundColor(ContextCompat.getColor(parent.getContext(), R.color.colorPrimary));
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        setPreferenceScreen(null);
        addPreferencesFromResource(R.xml.preferences);
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(listener);
        ...
        preferenceTheme.setTitle("Theme");
        int themeSet = Integer.valueOf(getPreferenceScreen().getSharedPreferences().getString(theme, "System Settings"));
        switch (themeSet) {
            case 2 :
                preferenceTheme.setSummary("Dark");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                break;
            case 1 :
                preferenceTheme.setSummary("Light");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                break;
            default :
                preferenceTheme.setSummary("System Default");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
        }
        currView.setBackgroundColor(ContextCompat.getColor(parent.getContext(), R.color.cpWhite));
        parent.getContext().setTheme(R.style.PreferenceTheme);
    }

    @Override
    public void onStart() {
        super.onStart();
        setPreferenceScreen(null);
        addPreferencesFromResource(R.xml.preferences);
    }

    @Override
    public void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener);
    }
}

运行时,该片段会记录主题更改,但不会更改主题.这是怎么回事:

When run, the fragment does register the change in theme, but it does not change the theme. Here's how it goes:

黑暗主题集:

更改为轻量级主题:

首选项"设置为灯光"主题,但主题"未设置为灯光":

The Preference is set to Light theme but the Theme is not set to Light:

此问题有任何解决方法吗?

Is there any fix for this problem?

推荐答案

您似乎没有在首选项更改侦听器中包含任何主题设置逻辑(仅在onResume中).

It doesn't look like you included any theme-setting logic in your preference change listeners (only in onResume).

尝试在听众中包含 AppCompatDelegate.setDefaultNightMode(...).

这篇关于刷新设置片段以合并黑暗模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆