【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を配置して複数階層構造を作る方法が推奨されています。 今回は、PreferenceActivityに定義されているシングルペインモード時に使用するメソッドを説明します。

任意のFragmentを起動する

シングルモードではヘッダーリストのアイテムをクリックすることで、アイテムに対応したコンテンツペインを持ったActivityが起動します。
この動作をJavaコードで行うためにはPreferenceActivity#startWithFragmentを使用します。
このメソッドには下記の2つのオーバロードが存在します。
void startWithFragment(String fragmentName, Bundle args, Fragment resultTo, int resultRequestCode)
String fragmentName起動するFragmentを指定します。
Bundle args起動するFragmentに渡すデータをBundleインスタンスを使って指定します。
Fragment resultTo起動したActivityが結果を返す先を指定します。この引数で指定したFragmentのstartActivityForResultが呼ばれます。引数にnullを指定した場合はstartActivityが呼ばれます。
int resultRequestCode起動したActivityが結果を返す時のコードを指定します。
void startWithFragment(String fragmentName, Bundle args, Fragment resultTo, int resultRequestCode, int titleRes, int shortTitleRes)
String fragmentName起動するFragmentを指定します。
Bundle args起動するFragmentに渡すデータをBundleインスタンスを使って指定します。
Fragment resultTo起動したActivityが結果を返す先を指定します。この引数で指定したFragmentのstartActivityForResultが呼ばれます。引数にnullを指定した場合はstartActivityが呼ばれます。
int resultRequestCode起動したActivityが結果を返す時のコードを指定します。
int titleResタイトルに設定する文字列リソースIDを指定します。
int shortTitleRes省略タイトルに設定する文字列リソースIDを指定します。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button footerView = new Button(this);
        footerView.setText("Footer");
        footerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startWithFragment(Prefs1Fragment.class.getName() , new Bundle() , null , 0 , 0 , 0);
            }
        });
        setListFooter(footerView);
    }

コンテンツペインを起動する時のIntent

コンテンツペインを持ったActivityの起動に使用する時にはIntent onBuildStartFragmentIntent(String fragmentName, Bundle args, int titleRes, int shortTitleRes)が呼ばれます。
onBuildStartFragmentIntentをオーバーライドすることでIntentの内容を書き換えることができます。
String fragmentName起動するFragmentの名前が設定されています。
Bundle args起動するFragmentに渡すデータが設定されています。
int titleResタイトルの文字列リソースIDが設定されています。
int shortTitleRes省略タイトルの文字列リソースIDが設定されています。
また、このIntentに下記のデータを設定することで、コンテンツペインActivityの下部にボタンバーを表示することができます。
extra_prefs_show_button_barボタンバーの表示・非表示を設定します。trueの場合は表示、falseの場合は非表示となります。
extra_prefs_set_next_text次へボタンに表示される文字列を設定します。文字列が設定された時はボタンに文字列が表示され、設定されていない時は非表示になります。ボタンをクリックするとActivityが終了し、Activity.RESULT_OKがリザルトコードとして設定されます。
extra_prefs_set_back_text戻るボタンに表示される文字列を設定します。文字列が設定された時はボタンに文字列が表示され、設定されていない時は非表示になります。ボタンをクリックするとActivityが終了し、Activity.RESULT_CANCELEDがリザルトコードとして設定されます。
extra_prefs_show_skipスキップボタンの表示・非表示を設定します。trueの場合は表示、falseの場合は非表示となります。ボタンをクリックするとActivityが終了し、Activity.RESULT_OKがリザルトコードとして設定されます。
    @Override
    public Intent onBuildStartFragmentIntent(String fragmentName, Bundle args, @StringRes int titleRes, int shortTitleRes) {
        // タイトルの文字列リソースIDを変更する
        titleRes = R.string.pref_title_add_friends_to_messages;
        Intent intent = super.onBuildStartFragmentIntent(fragmentName, args, titleRes, shortTitleRes);
        // ボタンバーを表示する
        intent.putExtra("extra_prefs_show_button_bar" ,true);
        // 次へボタンのテキストを指定する
        intent.putExtra("extra_prefs_set_next_text" ,"次へ");
        // 戻るボタンのテキストを指定する
        intent.putExtra("extra_prefs_set_back_text" ,"戻る");
        // スキップボタンの表示を指定する
        intent.putExtra("extra_prefs_show_skip" ,true);
        return intent;
    }