【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を配置して複数階層構造を作る方法が推奨されています。 今回は、Android3.0(API レベル 11)以降の実装方法を使った時にできる設定画面をカスタマイズする方法を説明します。

ヘッダーリストペインにフッターを設定する

void setListFooter(View view)を使うことでヘッダーリストペインの下部に任意のViewを設定することができます。
    @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) {
                Log.d(TAG, "onClick: ");
            }
        });
        setListFooter(footerView);
    }

設定項目画面にアクションバーを設定する

PreferenceActivityにアクションバーを追加するには少し裏技が必要となります。
まず、PreferenceActivityはcom.android.internal.R.layout.preference_list_contentというレイアウトを読み込んでいます。
このレイアウトファイルは下記のように構成になっています。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout >
    <LinearLayout>
        <LinearLayout>
            <ListView android:id="@android:id/list"/>
            <FrameLayout android:id="@+id/list_footer"/>
        </LinearLayout>
        <LinearLayout>
            <include layout="@layout/breadcrumbs_in_fragment" />
            <android.preference.PreferenceFrameLayout android:id="@+id/prefs"/>
        </LinearLayout>
    </LinearLayout>
    <RelativeLayout android:id="@+id/button_bar">
        <Button android:id="@+id/back_button"/>
        <LinearLayout>
            <Button android:id="@+id/skip_button"/>
            <Button android:id="@+id/next_button"/>
        </LinearLayout>
    </RelativeLayout>
</LinearLayout>
idがandroid.id.listのListViewから見て3つ外側にあるLinearLayoutの一つ目にアクションバーを追加する必要があります。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout linearLayout = (LinearLayout) findViewById(android.R.id.list).getParent().getParent().getParent();
        Toolbar toolbar = (Toolbar) getLayoutInflater().inflate(R.layout.toolbar, null);
        linearLayout.addView(toolbar, 0);
        setActionBar(toolbar);
    }

アクションバーにパンくずリストを表示する

PreferenceActivityのアクションバーにはパンくずリストを設定することができます。
パンくずリストにはFragmentBreadCrumbsをアクションバーに設定する必要があります。
また、idはandroid.R.id.titleである必要があります。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout linearLayout = (LinearLayout) findViewById(android.R.id.list).getParent().getParent().getParent();
        Toolbar toolbar = (Toolbar) getLayoutInflater().inflate(R.layout.toolbar, null);
        linearLayout.addView(toolbar, 0);
        FragmentBreadCrumbs fragmentBreadCrumbs = new FragmentBreadCrumbs(this);
        fragmentBreadCrumbs.setId(android.R.id.title);
        toolbar.addView(fragmentBreadCrumbs);
        setActionBar(toolbar);
    }

パンくずリストにタイトルを表示する

FragmentBreadCrumbsを表示しているPreferenceActivityはマルチペインモード時にいくつかの文字列を表示することができます。
画面左から順にタイトル、親タイトル、パンくずです。下記のメソッドで設定が可能です。
void setTitle(CharSequence title)アクションバーのタイトルを書き換えるメソッドです。パンくずリストの有無に関わらず使用が可能です。
void setParentTitle(CharSequence title, CharSequence shortTitle, View.OnClickListener listener)アクションバーの親タイトルを書き換えるメソッドです。同時に親タイトルをクリックした時のリスナーを設定することができます。このメソッドを使用するには先にshowBreadCrumbsを使う必要があります。親タイトルはマルチペイン時しか表示されません。
void showBreadCrumbs(CharSequence title, CharSequence shortTitle)アクションバーのパンくずを書き換えるメソッドです。パンくずリストはマルチペイン時しか表示されません。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout linearLayout = (LinearLayout) findViewById(android.R.id.list).getParent().getParent().getParent();
        Toolbar toolbar = (Toolbar) getLayoutInflater().inflate(R.layout.toolbar, null);
        linearLayout.addView(toolbar, 0);

        FragmentBreadCrumbs fragmentBreadCrumbs = new FragmentBreadCrumbs(this);
        fragmentBreadCrumbs.setId(android.R.id.title);
        toolbar.addView(fragmentBreadCrumbs);
        setActionBar(toolbar);

        Button footerView = new Button(this);
        footerView.setText("Footer");
        footerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setTitle("Title");
                showBreadCrumbs("BreadCrumbs" , "BreadCrumbs");
                setParentTitle("ParentTitle", "ParentTitle", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MyPreference1Activity.this, "onClick ParentTitle", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
        setListFooter(footerView);
    }