我正在尝试使用Android PreferenceScreen
作为布局用户设置的便捷方式,但我不想将首选项保存到设备共享首选项。这是可能的,还是应该使用其他机制,例如ListView
?
使用PreferenceScreen
类型似乎非常方便,因为我需要不同的小部件(即。开关,编辑文本)。但我已经遇到了持久性问题,即。我输入的任何东西都会在我不想要它的时候持续存在。
的settings.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Preference
android:key="settings_type"
android:title="@string/label_type" />
<EditTextPreference
android:key="settings_edit_name"
android:title="@string/label_name"
android:dialogTitle="Enter a name"
android:singleLine="true" />
<SwitchPreference
android:key="settings_edit_state"
android:title="@string/label_state"
android:summary="Enable or disable the state" />
</PreferenceScreen>
答案 0 :(得分:13)
我知道这是一个老问题,但我发现它非常有趣。只需将此属性设置为您的首选项,就不会保存:
android:persistent="false"
答案 1 :(得分:5)
我重新阅读了相应的docs并确定了如何通过实施Preference.OnPreferenceChangeListener
界面来阻止保存偏好设置。
public static interface Preference.OnPreferenceChangeListener
当值的调用时要调用的回调的接口定义 此首选项已被用户更改,即将设置 和/或坚持。这使客户有机会阻止设置 和/或坚持价值。
示例:
public class SettingsFragment extends PreferenceFragment {
public static SettingsFragment newInstance(int index) {
SettingsFragment f = new SettingsFragment();
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.layout.settings);
// getArguments().getInt("index");
EditTextPreference namePreference = (EditTextPreference) findPreference("settings_edit_name");
namePreference.setOnPreferenceChangeListener(new NamePreferenceChangeListener());
}
private class NamePreferenceChangeListener implements Preference.OnPreferenceChangeListener {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Do something else presumably and then return false to avoid saving the pref.
return false;
}
}
答案 2 :(得分:1)
您可以使用线性布局并将所需组件的非首选版本放在其中。
答案 3 :(得分:0)
由于必须存储首选项,因此您始终可以在onCreate中清除它们
在onCreate of PreferenceFragment
中尝试此操作super.onCreate();
getPreferenceManager().setSharedPreferencesName("custom");
SharedPreferences sp = getPreferenceManager().getSharedPreferences();
SharedPreferences.Editor editor = sp.edit();
editor.clear();
editor.apply();
答案 4 :(得分:0)
我建议创建PreferenceDataStore
的子类并将其分配给您的PreferenceManager
。
要实现并提供给Preference框架的数据存储接口。如有必要,可用于替换默认的android.content.SharedPreferences。
public void setPreferenceDataStore (PreferenceDataStore dataStore)
设置一个PreferenceDataStore,供与此管理器相关联的所有首选项使用,这些首选项没有通过
Preference.setPreferenceDataStore(PreferenceDataStore)
分配的自定义PreferenceDataStore。同样,如果设置了数据存储,则子首选项只要分配给该管理器,就不会使用SharedPreferences。
class CustomDataStore: PreferenceDataStore() {
override fun putBoolean(key: String?, value: Boolean) {
when (key) {
knownKey -> // Do something
anotherKnownKey -> // Do somthing else
}
}
override fun putString(key: String?, value: String?) {
when (key) {
knownKey -> // Do something
anotherKnownKey -> // Do something else
}
}
// You can ignore unused types but make sure to still override to avoid UnsupportedOperationException
override fun putFloat(key: String?, value: Float) {}
override fun putInt(key: String?, value: Int) {}
override fun putLong(key: String?, value: Long) {}
override fun putStringSet(key: String?, values: MutableSet<String>?) {}
override fun getBoolean(key: String?, defValue: Boolean): Boolean {
return when (key) {
knownKey -> // Do something
anotherKnownKey -> // Do something else
else -> defValue
}
}
override fun getString(key: String?, defValue: String?): String? {
return when (key) {
knownKey -> // Do something
anotherKnownKey -> // Do something else
else -> defValue
}
}
}
注意::在子类化时要小心,因为所有抽象的put()
方法都会抛出UnsupportedOperationException
。
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
// Prevent saving to SharedPreferences, use a custom data store
preferenceManager.preferenceDataStore = CustomDataStore()
}