如何停止将 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>)
就是这样
快乐编码
我有一个 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>)
就是这样 快乐编码