【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);
}