タイトルバーをカスタマイズ(+非表示に)する


タイトルバーにアイコンを表示する ではタイトルバーに、アイコンを表示する方法を解説しました。今回は、アイコンだけではなくて、自由に表示内容を変える方法を紹介します。タイトルバーに関する主なカスタマイズは以下とおりです。

Window.FEATURE一覧(抜粋)

マクロ名 説明
Window.FEATURE_NO_TITLE タイトルバーを非表示にする
Window.FEATURE_CUSTOM_TITLE 任意のレイアウトファイルを設定する
Window.FEATURE_LEFT_ICON アイコン画像を付与する
Window.FEATURE_RIGHT_ICON アイコン画像を付与する


アイコン画像の付与(Window.FEATURE_LEFT_ICON、Window.FEATURE_RIGHT_ICON)については、タイトルバーにアイコンを表示するを参照してください。今回はWindow.FEATURE_NO_TITLEとWindow.FEATURE_CUSTOM_TITLEについて紹介します。
サンプルコードはGoogleCodeのこちらで公開しています

Windowクラスで定義されている上記の値は、Activity#requestWindowFeatureメソッドを利用してActivityに設定します。たとえば、タイトルバーを非表示にする場合は以下のように記述します。

タイトルバーを非表示にする

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //タイトルバーを非表示にする(setContentViewの前にすること)
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
    }

3行目のコメントにもあるようにActivity#requestWindowFeatureメソッドはsetContentViewメソッドの前に設定してください。順番を入れ替えると設定値が反映されません。

Activity#requestWindowFeatureメソッドはsetContentViewメソッドの前、つまりViewを有効化するまえに設定しないと効力を発揮しないんだよ!

タイトルバーをカスタマイズする

タイトルバーは、任意のレイアウトファイルを設定することが可能です。タイトルバーの表示領域は広くはありませんが常に表示されています。任意のレイアウトに変更することで効果的な利用が可能です(下図、タイトルバー部分に”TitleBar”と”right”をそれぞれ表示)。

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //タイトルにレイアウトを指定する
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.main);

        //カスタマイズしたレイアウトファイルを指定
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);

setFeatureIntメソッドでR.layout.titlebarを設定します。

res/layout/titlebar.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView android:id="@+id/left_title_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="TitleBar" />
    <TextView android:id="@+id/right_title_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="right" />
</RelativeLayout>

レイアウトファイルに記載した内容がタイトルバーに反映されます。サンプルのtitlebarレイアウトファイルは2つのTextViewを横に並べています。

動的にタイトルを変更する


タイトルバーの表示内容は簡単に変えることができます。タイトルバーに適用したレイアウトファイル(titlebar.xml)からTextViewを取得、TextView#setTextメソッドを使って表示内容を変更してみましょう。

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //タイトルにレイアウトを指定する
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.main);

        //カスタマイズしたレイアウトファイルを指定
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);

        //タイトルバーのTextView
        final TextView leftTitle = (TextView) findViewById(R.id.left_title_text);

        //main.xmlのEditText、ボタンの設定
        final EditText leftTextEdit = (EditText) findViewById(R.id.left_text_edit);
        Button leftButton = (Button) findViewById(R.id.left_text_button);

        //ボタンのリスナ登録
        leftButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	leftTitle.setText(leftTextEdit.getText());
            }
        });

        final TextView rightTitle = (TextView) findViewById(R.id.right_title_text);
        final EditText rightTextEdit = (EditText) findViewById(R.id.right_text_edit);
        Button rightButton = (Button) findViewById(R.id.right_text_button);
        rightButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
            	rightTitle.setText(rightTextEdit.getText());
            }
        });
    }

サンプルでは、12行目でタイトルバー(titlebar.xml)のTextViewを取得します。
21行目:Activity側のleftButton/rightButtonボタン(レイアウトファイルはmain.xml)を押下した時の挙動です。EditTextで入力した文字列でタイトルバーのTextViewを更新しています。