Android PreferenceScreen - 我可以在不保存SharedPreferences首选项的情况下使用它吗?

Dan*_*lB6 14 android android-widget android-layout

我正在尝试使用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>
Run Code Online (Sandbox Code Playgroud)

Rom*_*iel 15

我知道这是一个老问题,但我发现它很有趣.只需将此属性设置为您的首选项,它就不会被保存:

android:persistent="false"
Run Code Online (Sandbox Code Playgroud)


Dan*_*lB6 6

我重新阅读了相应的文档,并确定了如何通过实现Preference.OnPreferenceChangeListener界面来防止保存首选项.

public static interface Preference.OnPreferenceChangeListener

当用户更改了此Preference的值并且即将设置和/或持久化时要调用的回调的接口定义.这使客户有机会阻止设置和/或持久化值.

例:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)


dra*_*sia 1

您可以只使用线性布局并将所需组件的非首选项版本放置在其中。

  • 这就是首选项小部件的全部要点,您实际上只需要常规小部件,例如“EditText”和“Switch”,每个首选项小部件也有一个常规版本。只需将它们放置在您想要的布局中,然后添加它们所需的侦听器即可。 (2认同)
  • 组件的非首选版本是什么?例如,我应该使用什么来替代 EditTextPreference?我尝试了EditText,但它无法设置摘要并在单击它时显示弹出对话框。 (2认同)