PreferenceFragmentを使って2Paneな設定画面を作成する
|先日、Android3.0(Honeycomb)のプレビュー版SDKが公開されました。
Honeycombから新しく実装されるFragment、それを利用し今回は早速2Paneな設定画面を作成してみます。
※ただし、プレビュー版であるためAPIは正規版と使用方法/動作内容が異なる場合があります。
それでは、続きをどうぞ
必要なもの
2Paneな設定画面を作成するのに、必要なものは以下の2つです。
「Header部分用のXMLファイル」
「Header要素ごとに、右Paneに表示させる内容」
非常に簡単な実装で、画像の様な画面を作成できます。
Header要素
まず、左側のPaneを作成します。
これらは、preference-headers要素として、preference_fragment.xmlに記述しています。
◇preference_fragment.xml◇
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> <header android:fragment="org.jpn.techbooster.sample.PreferenceFragmentSample.Main$TestPref" android:title="Pref Title Test" android:summary="Summary test" /> </preference-headers>
header 要素を追加することで、左側のリストを追加出来ます。
android:fragmentに指定している内容は、
Package名.クラス名$クラス名 の形式で書いたものです。
ここで指定したクラスが、左側Paneの要素を選択した場合に呼び出されます。
右側のPane要素の作成
右側のPaneに指定しているのは、設定画面を簡単に作るで紹介した内容です。
特に新しい要素等はありません。
◇innner_fragment.xml◇
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/title_1"> <CheckBoxPreference android:key="checkbox_preference" android:title="@string/checkbox_title_1" android:summary="@string/checkbox_summary_1" /> </PreferenceCategory> <PreferenceCategory android:title="@string/title_2"> <EditTextPreference android:key="edittext_preference" android:title="@string/edittext_title_1" android:summary="@string/edittext_summary_1" android:dialogTitle="@string/dialog_title_1" /> </PreferenceCategory> </PreferenceScreen>
呼び出し部分の作成
最後に、XMLファイルをロードする部分を作成します。
PreferenceActivityを継承したクラスを作成し、Honeycombで新規に追加された、
loadHeadersFromResource()を用いてpreference_fragment.xmlをロードします。
@Override public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.preference_fragment, target); }
※onBuildHeaders()はHeaderのBuildが必要になった際に呼び出されます。
※順を試してみたところ、「onCreate」→「onBuildHeaders」→「xmlで指定したfragment」→「onStart」… でした。
次に、右側に表示するFragmentを記述します。
新しく追加された、PreferenceFragmentクラスを継承したクラスを内部クラスとして作成します。
#Fragment自体が別にLifeCycleを保持しているのですが、それについては別途解説します。
public static class TestPref extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences addPreferencesFromResource(R.xml.innner_fragment); } }
※Class名はandroid:fragmentで指定したクラス名と合わせます。
以上で、2Paneな設定画面は作成できました。
最後に、Javaソースコード一覧を貼っておきます。
public class Main extends PreferenceActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onStart(){ super.onStart(); } @Override public void onResume(){ super.onResume(); } @Override public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.preference_fragment, target); } public static class TestPref extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences addPreferencesFromResource(R.xml.innner_fragment); } } }