Preferenceを使った設定画面の作成|Android開発

      2018/10/30

preferenceを使って設定を保存する方法の覚書です。
PreferenceFragmentを使うことで簡単に設定画面を作成することが可能になります。

設定画面のレイアウト

画面レイアウトは不要です。代わりに設定項目の一覧を用意します。
res\xmlフォルダを作成し、任意のxmlファイルを用意します。下記サンプルではpref_main.xmlというファイルを用意しました。

サンプル

CheckBox(ON/OFF)テキスト入力の項目を用意しています。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <CheckBoxPreference
        android:key="on_off_preference"
        android:title="Check Status" />

    <EditTextPreference
        android:key="text_value_preference"
        android:title="Text Value" />

</PreferenceScreen>

Activity

PreferenceActivityを継承したActivityを作成します。
今回はSettingsActivityというクラス名にしました。

PreferenceFragment

PreferenceFragmentを継承したクラスを上記Activityのインナークラスとして作成します。

サンプル

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.view.View;

import org.apache.commons.lang3.StringUtils;

public class SettingsActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new MainPreferenceFragment())
                .commit();
    }

    /********** PreferenceFragment **********/

    public static class MainPreferenceFragment extends PreferenceFragment
            implements SharedPreferences.OnSharedPreferenceChangeListener {

        public MainPreferenceFragment() {
            // Required empty public constructor
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_main);
        }

        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
        }

        @Override
        public void onResume() {
            super.onResume();
            SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
            sp.registerOnSharedPreferenceChangeListener(this);
            setSummaries(sp);
        }

        @Override
        public void onPause() {
            super.onPause();
            getPreferenceScreen().getSharedPreferences()
                .unregisterOnSharedPreferenceChangeListener(this);
        }

        private void setSummaries(final SharedPreferences sp) {
            // 取得方法
            final boolean onOff = sp.getBoolean("on_off_preference", false);
            final String text = sp.getString("text_value_preference", StringUtils.EMPTY);
            findPreference("text_value_preference").setSummary(text);
        }

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            setSummaries(sharedPreferences);
        }
    }
}
SharedPreferencesPreferenceManager.getDefaultSharedPreferences(getActivity());でも取得可能。
追記:PreferenceScreenで設定した値を取得する|Android開発

setSummariesでは現在の入力テキストをサマリとして表示しています。

SettingsActivityを起動すると下記の画面が表示されます。

PreferenceFragment

テキスト入力の項目を開いた画面。

EditTextPreference

一度設定画面を閉じて再度開いても設定した値が保存されています。

PreferenceFragment

 - Android