Android PreferenceScreen - Могу ли я использовать его без сохранения настроек в SharedPreferences?

Я пытаюсь использовать 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>

Ответ 1

Вы можете просто использовать линейный макет и размещать в нем нестандартные версии компонентов.

Ответ 2

Я знаю, что старый вопрос, но я считаю это довольно интересным. Просто установите этот атрибут в соответствии с вашими предпочтениями, и он не будет сохранен:

android:persistent="false"

Ответ 3

Я перечитаю соответствующий docs и определил, как предотвратить сохранение настроек путем реализации интерфейса Preference.OnPreferenceChangeListener.

открытый статический интерфейс 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;
    }

}

Ответ 4

Поскольку настройки привязаны к сохранению, вы всегда можете их очистить в onCreate

Попробуйте это в onCreate of PreferenceFragment

super.onCreate();
getPreferenceManager().setSharedPreferencesName("custom");
SharedPreferences sp = getPreferenceManager().getSharedPreferences();
SharedPreferences.Editor editor = sp.edit();
editor.clear();
editor.apply();