【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を起動する

マルチペインモードでコンテンツペインに任意のFragmentを表示するにはvoid startPreferenceFragment(Fragment fragment, boolean push)を使用します。
第一引数には表示するFragmentを指定します。第二引数には表示するFragmentをバックスタックに入れるかどうかを指定します。バックスタックに入れる場合はtrueを渡し、入れない場合はfalseを渡します。
    @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) {
                startPreferenceFragment(new Fragment() , false);
            }
        });
        setListFooter(footerView);
    }

任意の設定用Fragmentを起動する

startPreferenceFragmentではどのようなFragmentでも設定することが可能でした。 そのため、妥当な設定用Fragmentを表示するにはPreferenceActivity#switchToHeaderを使用する必要があります。
このメソッドで配置されるFragmentはisValidFragmentでFragmentの妥当性を検査されます。
PreferenceActivity#switchToHeaderには下記の2つのオーバーロードが存在します。
void switchToHeader(String fragmentName, Bundle args)
String fragmentName表示するFragmentを名前で指定します。
Bundle args表示するFragmentに渡すデータを設定します。
void switchToHeader(PreferenceActivity.Header header)
PreferenceActivity.Header header表示するFragmentやデータをPreferenceActivity.Headerインスタンスで指定します。

    @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) {
                switchToHeader(Prefs2Fragment.class.getName() , new Bundle());
            }
        });
        setListFooter(footerView);
    }

    @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) {
                Header header = new Header();
                header.fragment = Prefs2Fragment.class.getName();
                header.extras = new Bundle();
                switchToHeader(header);
            }
        });
        setListFooter(footerView);
    }

コンテンツペインの変化を検知する

void onContentChanged()はコンテンツペインが変化した時に呼ばれるメソッドです。
PreferenceActivity#onContentChangedをオーバーライドすることでコンテンツペインの変化を検知することができます。
    @Override
    public void onContentChanged() {
        Toast.makeText(this, "onContentChanged", Toast.LENGTH_SHORT).show();
        super.onContentChanged();
    }