如何停止将 PreferenceFragment 设置设置为默认的 SharedPreferences

How to stop PreferenceFragment setting Settings into default SharedPreferences

我有一个 PreferenceFragment,当用户更改指定的首选项时,我想检查是否授予了权限。不然我要取消Preference Set

我的偏好片段:

public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
SharedPreferences sharedPreferences;

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    PreferenceManager preferenceManager = getPreferenceManager();
    preferenceManager.setSharedPreferencesName("com.******.*******.mainSettings");
    setPreferencesFromResource(R.xml.main_preferences, rootKey);
    getActivity().setTheme(R.style.AppTheme_SettingsFragment);
}

@Override
public void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    super.onPause();
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    switch (key) {
        case "usesBiometricStart": {
            if(sharedPreferences.getBoolean(key,false)) {
                FingerprintManager fingerprintManager = (FingerprintManager) Objects.requireNonNull(getActivity()).getSystemService(FINGERPRINT_SERVICE);
                assert fingerprintManager != null;
                if (!fingerprintManager.isHardwareDetected()) {
                    Snackbar snackbar = Snackbar.make(Objects.requireNonNull(getView()), R.string.object_no_fingerprint_permission, Snackbar.LENGTH_LONG);
                    snackbar.setBackgroundTint(getActivity().getColor(R.color.black_50));
                    TextView textView = snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_text);
                    textView.setMaxLines(5);
                    snackbar.show();
                    sharedPreferences.edit().putBoolean(key,false).apply();
                    return;
                }

                if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
                    Snackbar snackbar = Snackbar.make(Objects.requireNonNull(getView()), R.string.object_no_fingerprint_permission, Snackbar.LENGTH_LONG);
                    snackbar.setBackgroundTint(getActivity().getColor(R.color.black_50));
                    TextView textView = snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_text);
                    textView.setMaxLines(5);
                    snackbar.show();
                    sharedPreferences.edit().putBoolean(key,false).apply();
                    return;
                }

                if (fingerprintManager.hasEnrolledFingerprints()) {
                    Snackbar snackbar = Snackbar.make(Objects.requireNonNull(getView()), R.string.object_enrolled_finger_needed, Snackbar.LENGTH_LONG);
                    snackbar.setBackgroundTint(getActivity().getColor(R.color.black_50));
                    TextView textView = snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_text);
                    textView.setMaxLines(5);
                    snackbar.show();
                    sharedPreferences.edit().putBoolean(key,false).apply();
                    return;
                }
            }
        }
    }
}
}

但我不知道为什么

Edit

sharedPreferences.edit().putBoolean(key,false).apply(); 此行有效但不会在运行时更改开关 属性。这意味着如果我将其设置为真。 属性 将重新保存为 false,然后我重新打开该片段,它也是 false。

所以我的实际问题是如何以编程方式更改 switchPreference onRunntime 的值。

答案是使用((SwitchPreference)findPreference("<preferencekey>")).setChecked(<bool>)

就是这样 快乐编码