【Androidアプリケーションの設定画面を作ろう】PreferenceActivityで設定画面を作る古い方法
PreferenceActivityは設定画面を作るためのActivityです。
Android3.0(API レベル 11)を境に前と後で実装方針が大きく変化しています。
- Android3.0以前はPreferenceActivityを単体で使い設定画面を作成します。
- Android3.0以後は「ActivityとPreferenceFragment」や「PreferenceActivityとPreferenceFragment」を組み合わせて作成します。
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); } }