【Androidアプリケーションの設定画面を作ろう】PreferenceActivityで設定画面を作る古い方法

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

PreferenceActivityは設定画面を作るためのActivityです。
Android3.0(API レベル 11)を境に前と後で実装方針が大きく変化しています。
  • Android3.0以前はPreferenceActivityを単体で使い設定画面を作成します。
  • Android3.0以後は「ActivityとPreferenceFragment」や「PreferenceActivityとPreferenceFragment」を組み合わせて作成します。
Android3.0(API レベル 11)以降はPreferenceActivityで直接設定項目を操作することは非推奨となり、 通常のActivityにPreferenceFragmentを配置して作成するか、PreferenceActivityにPreferenceFragmentを配置して複数階層構造を作る方法が推奨されています。 今回は、Android3.0(API レベル 11)以前の実装方法を説明します。
PreferenceManager getPreferenceManager()PreferenceActivity内部にあるPreferenceを管理するPreferenceManagerインスタンスを返却します。
void setPreferenceScreen(PreferenceScreen preferenceScreen)PreferenceActivityのルート要素のPreferenceScreenを設定します。
PreferenceScreen getPreferenceScreen()PreferenceActivityのルート要素のPreferenceScreenを取得します。
void addPreferencesFromIntent(Intent intent)AndroidManifest.xmlで定義されているactivityタグ内のmetaタグからxmlリソースを読み込み設定項目を追加します。
void addPreferencesFromResource(int preferencesResId)設定項目が定義されているxmlリソースIDを指定して設定項目を追加します。
Preference findPreference(CharSequence key)設定項目のkeyを元にPreferenceインスタンスを探します。
boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)設定項目がクリックされた時に呼ばれるメソッドです、このメソッドをオーバライドすることでクリック時に任意の処理を行うことができます。

設定項目を追加する

設定項目を追加する方法は3つあります。

PreferenceActivity#setPreferenceScreen

PreferenceActivity#setPreferenceScreenはPreferenceActivityに配置するルートPreferenceScreenを設定するメソッドです。
このメソッドはPreferenceScreenの追加ではなく、入れ替えなので呼び出し前に設定していた設定項目たちは消えてしまうことに注意してください。
        PreferenceScreen preferenceScreen = getPreferenceManager().createPreferenceScreen(this);
        preferenceScreen.setTitle("設定項目タイトル");
        Preference preference = new Preference(this);
        preference.setTitle("設定項目 from Java");
        preferenceScreen.addPreference(preference);
        setPreferenceScreen(preferenceScreen);

PreferenceActivity#addPreferencesFromResource

PreferenceActivity#addPreferencesFromResourceはxmlリソースIDを引数に取ります。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <Preference
        android:title="設定項目 1 from xml"
        android:key="setting_1"/>
    <Preference
        android:title="設定項目 2 from xml"
        android:key="setting_2"/>

</PreferenceScreen>

        addPreferencesFromResource(R.xml.preference_single);

PreferenceActivity#addPreferencesFromIntent

PreferenceActivity#addPreferencesFromIntentはAndroidManifest.xmlのactivityタグ内のmeta-dataタグからxmlリソースを読み込み設定項目を追加します。
meta-dataタグにはname属性とresource属性を設定する必要があります。name属性には”android.preference”を設定し、resource属性に設定項目が定義されたxmlリソースIDを設定します。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <Preference
        android:title="設定項目 1 From Intent"
        android:key="setting_1"/>
    <Preference
        android:title="設定項目 2 From Intent"
        android:key="setting_2"/>

</PreferenceScreen>

        <activity android:name=".MyPreferenceActivity">
            <meta-data  android:name="android.preference"
                android:resource="@xml/preference_from_intent" />
        </activity>

        Intent intent = new Intent(this, MyPreferenceActivity.class);
        addPreferencesFromIntent(intent);

設定項目を探す

PreferenceActivity#findPreferenceはPreferenceActivityが管理しているPreferenceの中から、引数で指定した文字列と一致するkey属性を持つPreferenceを探し出します。
        Preference setting_1 = findPreference("setting_1");
        Log.d(TAG, setting_1.getKey());

設定項目がクリックされた時に処理を行う

設定項目がクリックされた時に処理を行う時には、PreferenceActivity#onPreferenceTreeClickをオーバーライドする必要があります。
PreferenceActivity#onPreferenceTreeClickは下記の二つの引数を持ちます。
  • PreferenceScreen preferenceScreen : PreferenceActivityに設定されているルート要素PreferenceScreenインスタンスです。
  • Preference preference : クリックされたPreferenceインスタンスです。
    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        Log.d(TAG, "onPreferenceTreeClick: " + preference.getTitle());
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }

まとめ

今回はPreferenceActivityのみで設定画面を作成する方法を説明しました。
この方法自体は現在は非推奨となっているため使いませんが、古いバージョンをサポートする必要がある場合に使用してください。
        <activity android:name=".MyPreferenceActivity">
            <meta-data  android:name="android.preference"
                android:resource="@xml/preference_from_intent" />
        </activity>

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <Preference
        android:title="設定項目 1 From Intent"
        android:key="setting_1"/>
    <Preference
        android:title="設定項目 2 From Intent"
        android:key="setting_2"/>

</PreferenceScreen>

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <Preference
        android:title="設定項目 1 from xml"
        android:key="setting_1"/>
    <Preference
        android:title="設定項目 2 from xml"
        android:key="setting_2"/>

</PreferenceScreen>

public class MyPreferenceActivity extends PreferenceActivity {

    private static final String TAG = "MyPreferenceActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        PreferenceScreen preferenceScreen = getPreferenceManager().createPreferenceScreen(this);
        preferenceScreen.setTitle("設定項目タイトル");
        Preference preference = new Preference(this);
        preference.setTitle("設定項目 from Java");
        preferenceScreen.addPreference(preference);
        setPreferenceScreen(preferenceScreen);

        addPreferencesFromResource(R.xml.preference_single);
        Intent intent = new Intent(this, MyPreferenceActivity.class);
        addPreferencesFromIntent(intent);
        Preference setting_1 = findPreference("setting_1");
        Log.d(TAG, setting_1.getKey());
    }

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        Log.d(TAG, "onPreferenceTreeClick: " + preferenceScreen.getTitle());
        Log.d(TAG, "onPreferenceTreeClick: " + preference.getTitle());
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }
}