【Androidアプリケーションの設定画面を作ろう】PreferenceActivityで設定画面をカスタマイズする
PreferenceActivityは設定画面を作るためのActivityです。
Android3.0(API レベル 11)を境に前と後で実装方針が大きく変化しています。
- Android3.0以前はPreferenceActivityを単体で使い設定画面を作成します。
- Android3.0以後は「ActivityとPreferenceFragment」や「PreferenceActivityとPreferenceFragment」を組み合わせて作成します。
ヘッダーリストペインにフッターを設定する
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); }