刷新设置片段以合并黑暗模式

问题描述

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

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);
    }
}

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

黑暗主题集:

Dark Theme Set

更改为轻主题

Changing to Light Theme

首选项设置为Light主题,但主题未设置为Light:

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

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

解决方法

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

尝试在听众中加入AppCompatDelegate.setDefaultNightMode(...)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...