Android3系の設定画面は、左にメニュー(これをヘッダーと呼ぶ)、右に設定内容というのが標準的になっている。
このヘッダー付き設定画面を作るには、PreferenceActivityを継承したクラスでonBuildHeadersをオーバーライドし、次のようなxmlをloadHeadersFromResourceで指定する。
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="FragmentClass"
android:title="タイトル" android:summary="サマリー"/>
<header
android:title="サイトを開く"
android:summary=""
>
<intent android:action="android.intent.action.VIEW"
android:data="http://www.google.com" />
</header>
</preference-headers>
で、設定画面内で画面遷移するには、FragmentManagerを使う。
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
MyFragment fragment = new MyFragment();
transaction.replace(parentId, fragment);
transaction.addToBackStack(null);
transaction.commit();
FragmentをreplaceするIDはFragment.onCreateViewの第二引数で渡されるViewGroupのgetIdで取得した値を設定する。
画面遷移を戻る場合はFragmentManager#popBackStack()だ。
そして、場合によっては深い階層にある自作の設定画面に直接遷移したいことがある。
そういう場合は次のようにIntentを投げる。
setClassでPreferenceActivityを継承したクラス。putExtraのEXTRA_SHOW_FRAGMENTでFragmentのクラス名を指定するのがポイントだ。
Intent i = new Intent();
i.setClass(this,MyPreferenceActivity.class);
i.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, "jp.rainbowdevil.MyPreferenceFragment");
i.putExtra("ID", 1);
startActivity(i);
表示した設定画面のFragment内でIntentの情報を受け取るには、getActivity().getIntent()を使おう。
また、開いた設定画面のFragmentのボタンを選択すると、設定画面のFragmentを遷移したい場合がある。その場合は次のようにして画面遷移を行う。
PreferenceActivity activity = (PreferenceActivity)getActivity();
MySettingPreference preference = new MySettingPreference();
activity.startPreferenceFragment(mySettingPreference, true);