16

ユーザー設定をレイアウトする便利な方法として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>
4

5 に答える 5

18

それは古い質問ですが、非常に興味深いと思います。この属性を好みに設定するだけで、保存されません。

android:persistent="false"
于 2013-09-23T08:36:55.467 に答える
6

適切なドキュメントを読み直し、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;
    }

}
于 2013-01-31T20:11:36.740 に答える
1

線形レイアウトを使用して、必要なコンポーネントの非優先バージョンを配置することができます。

于 2013-01-31T19:22:26.383 に答える
0

プリファレンスは保存されるようにバインドされているため、onCreateでいつでもクリアできます

PreferenceFragmentのonCreateでこれを試してください

super.onCreate();
getPreferenceManager().setSharedPreferencesName("custom");
SharedPreferences sp = getPreferenceManager().getSharedPreferences();
SharedPreferences.Editor editor = sp.edit();
editor.clear();
editor.apply();
于 2013-01-31T19:41:03.290 に答える
0

のサブクラスを作成して、PreferenceDataStoreに割り当てることをお勧めしますPreferenceManager

設定データストア

実装され、Preferenceフレームワークに提供されるデータストアインターフェイス。これは、必要に応じて、デフォルトのandroid.content.SharedPreferencesを置き換えるために使用できます。

PreferenceManager

public void setPreferenceDataStore (PreferenceDataStore dataStore)

を介して割り当てられたカスタムPreferenceDataStoreを持たない、このマネージャーに関連付けられたすべての設定で使用されるPreferenceDataStoreを設定しますPreference.setPreferenceDataStore(PreferenceDataStore)。また、データストアが設定されている場合、子プリファレンスは、このマネージャーに割り当てられている限り、SharedPreferencesを使用しません。

CustomDataStore

    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

PreferenceFragmentまたはPreferenceFragmentCompat

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    // Prevent saving to SharedPreferences, use a custom data store
    preferenceManager.preferenceDataStore = CustomDataStore()
}
于 2020-11-24T03:00:41.803 に答える