【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に定義されているモード関わらずに使用するメソッドを説明します。

コンテンツペインのクリックを検知する

boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref)はコンテンツペインの fragment属性が設定された項目をクリックした時に呼ばれるメソッドです。
PreferenceActivity#onPreferenceStartFragmentをオーバーライドすることでクリックされたことを検知することができます。
第一引数はコンテンツペインに設置されているFragmentのインスタンス、第二引数はクリックされた設定項目のPreferenceインスタンスがそれぞれ渡されます。

    @Override
    public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
        Log.d(TAG, "onPreferenceStartFragment: " + pref.getFragment());
        return super.onPreferenceStartFragment(caller, pref);
    }

コンテンツペインを変更する

void startPreferencePanel(String fragmentClass, Bundle args, int titleRes, CharSequence titleText, Fragment resultTo, int resultRequestCode)はコンテンツペインを変更するメソッドです。
PreferenceActivity#startPreferencePanelはシングルモードとマルチペインモードで動作が異なります。
シングルモードではPreferenceActivity#startWithFragmentを使ってコンテンツペインを変更します。
マルチペインモードではFragmentManagerを使ってコンテンツペインを変更します。
String fragmentClass起動するFragmentの完全修飾名を設定します。
Bundle args起動するFragmentに渡すデータを設定します。
int titleResタイトルに設定する文字列リソースIDを設定します。
CharSequence titleTextタイトルに設定する文字列で設定します。
Fragment resultToFragment#setTargetFragmentを使い結果を返すFragmentを設定します。
int resultRequestCodeFragment#setTargetFragmentを使い結果を返す時のリクエストコードを設定します。

    @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) {
                startPreferencePanel(Prefs1Fragment.class.getName() , new Bundle() , 0 , "aaa" , null , 0);
            }
        });
        setListFooter(footerView);
    }

コンテンツペインを終了する

void finishPreferencePanel(Fragment caller, int resultCode, Intent resultData)はコンテンツペインを終了させるためのメソッドです。
PreferenceActivity#finishPreferencePanelはシングルモードとマルチペインモードで動作が異なります。
シングルモードではPreferenceActivity#setResultの後にPreferenceActivity#finishを使ってコンテンツペインが終了します。
マルチペインモードではPreferenceActivity#onBackPressedを使ってコンテンツペインのFragmentを戻し、Fragment#onActivityResultで結果を返却します。
Fragment callerシングルペインモードやマルチペインモードで結果を返す必要がない場合ではnullを渡します。
マルチペインモードで結果を返す場合はコンテンツペインに設定されているFragmentインスタンスを渡します。
int resultCode結果を返す先に渡すリザルトコードを設定します。
Intent resultData結果を返す先に渡すデータを設定します。

    public static class Prefs1Fragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_general);
        }

        @Override
        public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
            ((MyPreference1Activity)getActivity()).finishPreferencePanel(this, Activity.RESULT_OK,new Intent());
            return super.onPreferenceTreeClick(preferenceScreen, preference);
        }
    }

ヘッダーリストの表示・非表示を変更する

boolean onIsHidingHeaders()はヘッダーリストの表示・非表示を切り替えるために使用します。
PreferenceActivity#onIsHidingHeadersをオーバーライドし表示の場合はtrueを、非表示の場合はfalseを返却することで制御することができます。

    @Override
    public boolean onIsHidingHeaders() {
        return true;
    }