【问题标题】:Refreshing Settings Fragment to Incorporate Dark Mode刷新设置片段以合并暗模式
【发布时间】:2020-10-21 18:20:48
【问题描述】:

我有一个应用程序,我在其中使用 AppCompatDelegate 和 values-night.xml 以编程方式切换到应用程序内的深色主题。我有一个带有 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);
    }
}

运行时,片段会注册主题的更改,但不会更改主题。 事情是这样的:

黑暗主题集:

更改为浅色主题:

Preference 设置为 Light 主题,但 Theme 未设置为 Light:

这个问题有什么解决办法吗?

【问题讨论】:

    标签: android android-preferences android-darkmode


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多