0

AppCompatDelegate と values-night.xml を使用して、プログラムでアプリ内のダークテーマに切り替えるアプリがあります。それぞれの SharedPreferences 値をリッスンするように OnSharedPreferenceChangeListener を設定した SettingsFragment を持つ SettingsActivity.java があります。設定ページには、ダークモード設定が含まれています。ただし、設定を切り替えても、ダークモードは自動的にオンになりません。代わりに、アプリがモードを変更するために SettingsActivity を終了する必要があります。これが私のコードです:

設定Activity.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 に設定されていません:

環境設定は Light テーマに設定されていますが、Theme は Light に設定されていません

この問題の修正はありますか?

4

1 に答える 1

0

設定変更リスナーにテーマ設定ロジックが含まれていないようです (onResume のみ)。

AppCompatDelegate.setDefaultNightMode(...)リスナーに含めてみてください。

于 2020-10-21T10:20:48.893 に答える