官术网_书友最值得收藏!

2.5 菜單、對話框和標題欄

ContentView是一個Activity中的主要內容,菜單、對話框和標題欄是一個Activity中幾個附屬的部分。

2.5.1 菜單的使用

菜單是屏幕中比較獨立的一個元素,在Android中,菜單不同于一個普通的控件,其有單獨的接口和運作方式。

在Android中具有單獨接口,負責建立活動中的菜單(通常位于下部),主要菜單是用于活動中,這種屬于活動的菜單為OptionsMenu(選項菜單)。

使用選項菜單主要通過重載Activity中的幾個方法來實現:

        public boolean onCreateOptionsMenu(Menu menu)
        public boolean onOptionsItemSelected(MenuItem item)
        public void onOptionsMenuClosed (Menu menu)

onCreateOptionsMenu()用于在建立菜單時進行設置,建立時為每一個按鈕設置ID,菜單項被選擇時調用onOptionsItemSelected(),通過MenuItem類的getItemId()方法獲得這個菜單的ID,繼續進行處理。onOptionsMenuClosed()用于一個菜單啟動后被取消時的處理。

另外一種菜單屬于某個View,這種菜單稱為ContextMenu(上下文菜單),上下文菜單使用如下的方法來構建。

        public void onCreateContextMenu (ContextMenu menu, View v,
                                    ContextMenu.ContextMenuInfo menuInfo)
        public boolean onContextItemSelected(MenuItem item)
        public void  onContextMenuClosed(Menu menu)

菜單的幾個相關類均在android.view包中:Menu接口表示選項菜單,ContextMenu表示上下文菜單,MenuItem接口表示一個菜單項目。

提示:Activity中的onCreateContextMenu是View.OnCreateContextMenuListener接口中的方法,Activity實現了這個接口。由于Activity類實現了這個接口,因此在Activity中實現上下文菜單不需要再繼承這個接口,直接實現其中的方法即可。

1.基本菜單使用

對于一些比較簡單的菜單,可以通過直接操作Menu接口來完成,Menu主要具有以下一些方法:

        public abstract MenuItem add(int groupId, int itemId, int order, CharSequence title)
        public abstract MenuItem add(int groupId, int itemId, int order, int titleRes)

add()的第1、2個參數是整數值,分別代表按鈕項的組ID和菜單ID,第3個參數用于設置按鈕上的文件。itemId是菜單的主要標識。

MenuItem也是一個接口,其中主要包含了如下的方法:

        public abstract MenuItem setTitle (CharSequence title)    // 設置標題
        public abstract MenuItem setTitle (int title)             // 設置標題
        public abstract MenuItem setIcon (int iconRes)            // 設置圖標
        public abstract MenuItem setIntent (Intent intent)        // 設置事件
        public abstract MenuItem setVisible (boolean visible)     // 設置可見性

根據Menu返回MenuItem的句柄之后,除了可以設置標題之外,還可以設置圖標、菜單的事件、可見性等內容。

ContextMenu是Menu接口的一個實現者,用于表示上下文菜單。它比Menu多了幾個方法,如下所示:

        public abstract ContextMenu setHeaderTitle (CharSequence title)    // 設置標題
        public abstract ContextMenu setHeaderTitle (int titleRes)          // 設置標題
        public abstract ContextMenu setHeaderIcon (int iconRes)            // 設置圖標

上下文菜單和選項菜單的主要區別在于它多出了一個標題欄,因此可以設置標題欄和標題和圖標。

以下的例程序使用選項菜單和上下文菜單來控制按鈕的背景顏色和文本。程序的運行效果如圖2-11所示。

圖2-11 菜單示例程序的運行結果(左:原始程序;中:選項菜單;右:上下文菜單)

程序運行后,單擊菜單按鈕將出現選項菜單,在按鈕中長按將出現上下文菜單,兩種菜單分別如圖2-11中的中圖和右圖所示。

在選項菜單方面,主要的內容是建立和選擇兩個部分,這段代碼如下所示:

            public static final int RED_MENU_ID   = Menu.FIRST;
            public static final int GREEN_MENU_ID = Menu.FIRST + 1;
            public static final int BLUE_MENU_ID  = Menu.FIRST + 2;
            @Override
            public boolean onCreateOptionsMenu(Menu menu) {   // 創建選項菜單
              super.onCreateOptionsMenu(menu);
              menu.add(0, RED_MENU_ID, 0, R.string.red);     // 增加菜單項
              menu.add(0, GREEN_MENU_ID, 0, R.string.green);
              menu.add(0, BLUE_MENU_ID, 0, R.string.blue);
              return true;
            }
            @Override
            public boolean onOptionsItemSelected(MenuItem item) { // 創建菜單項目被選擇
              switch (item.getItemId()) {                         // 獲得菜單的ID
              case RED_MENU_ID:
                  mButton.setBackgroundColor(Color.RED);          // 設置紅色
                  mButton.setText(R.string.red);
                  return true;
              case GREEN_MENU_ID:
                  mButton.setBackgroundColor(Color.GREEN);        // 設置綠色
                  mButton.setText(R.string.green);
                  return true;
              case BLUE_MENU_ID:
                  mButton.setBackgroundColor(Color.BLUE);         // 設置藍色
                  mButton.setText(R.string.blue);
                  return true;
              }
              return super.onOptionsItemSelected(item);          // 調用默認的處理
            }
        }

onCreateOptionsMenu()創建菜單的內容,onOptionsItemSelected()響應每一個菜單項目的內容。MenuItem中的getItemId()方法用于標識是哪一個菜單發生了事件,返回的數值和建立菜單時候的itemId數值含義相同。

在上下文菜單方面,主要的內容也是建立和選擇兩個部分,這段代碼如下所示:

        public static final int CYAN_MENU_ID   = Menu.FIRST + 10; // 上下文菜單的id
        public static final int YELLOW_MENU_ID = Menu.FIRST + 11;
        public static final int MAGENTA_MENU_ID  = Menu.FIRST + 12;
        @Override
        public void onCreateContextMenu(ContextMenu menu, View view,
                                          ContextMenuInfo menuInfo) {
            menu.setHeaderTitle(R.string.color);                   // 設置上下文菜單的標題欄
            menu.add(0, CYAN_MENU_ID, 0, R.string.cyan);
            menu.add(0, YELLOW_MENU_ID, 0, R.string.yellow);
            menu.add(0, MAGENTA_MENU_ID, 0, R.string.magenta);
        }
        @Override
        public boolean onContextItemSelected(MenuItem item) {
            mButton.setText(item.getTitle());                      // 創建上下文菜單的標題
            switch (item.getItemId()) {
            case CYAN_MENU_ID:
              mButton.setBackgroundColor(Color.CYAN);              // 設置青色
              return true;
            case YELLOW_MENU_ID:
              mButton.setBackgroundColor(Color.YELLOW);            // 設置黃色
              return true;
            case MAGENTA_MENU_ID:
              mButton.setBackgroundColor(Color.MAGENTA);           // 設置洋紅色
              return true;
            }
            return false;
        }

在Activity中的onCreate()中使用以下代碼,將創建上下文菜單的接口設置給某個控件,代碼如下所示:

        mButton = (Button) findViewById(R.id.color_button);
        mButton.setOnCreateContextMenuListener(this);//實現了OnCreateContextMenuListener

onCreateContextMenu()的參數中,具有一個View的句柄,根據這個信息,可以選擇為不同的控件建立不同的菜單。

2.從XML文件中生成菜單

由于各個菜單的項目具有很大的通用性,因此Android提供了使用XML文件來描述菜單的方法。菜單的描述文件通??梢杂梅胖迷趓es/menu中的XML文件表示。

android.view中的MenuInflater類可以用于將XML文件描述的菜單轉化成菜單對象,MenuInflater主要包含一個inflate()方法,如下所示:

        public void inflate (int menuRes, Menu menu)

inflate()的第2個參數是Menu,表示將XML文件表示的菜單內容增加到這個菜單類當中。

ApiDemo中的Inflate from XML程序從XML文件中建立菜單:

        Inflate from XML(ApiDemo =>App=>Menu=>Inflate from XML)

源文件:src/com/example/android/apis/app/MenuInflateFromXml.java

菜單文件:res/menu/*

Inflate from XML程序的運行效果如圖2-12所示。

本程序的菜單中,使用各個XML文件來描述,其中res/menu中的title_only.xml是一個基本菜單的描述,內容如下所示:

        <menu xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:id="@+id/jump"   android:title="@string/jump" />
            <item android:id="@+id/dive"   android:title="@string/dive" />
        </menu>

其中android:id表示菜單的id,而android:title表示菜單上顯示的文本。

圖2-12 使用XML文件生成菜單運行效果(左:只有標題;中:設置;右:帶有圖標的菜單)

另一個描述菜單的XML文件title_icon.xml如下所示:

        <menu xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:id="@+id/happy"       android:title="Happy"
              android:icon="@drawable/stat_happy" />
            <item android:id="@+id/neutral"     android:title="Neutral"
              android:icon="@drawable/stat_neutral" />
            <item android:id="@+id/sad"          android:title="Sad"
              android:icon="@drawable/stat_sad" />
        </menu>

android:icon表示一個菜單上的圖標,這里將其指向幾張圖片文件。

在對應的Java代碼中,需要在onCreateOptionsMenu()中使用MenuInflater對菜單的XML文件進行處理,內容如下所示:

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            mMenu = menu;
            MenuInflater inflater = getMenuInflater();// 獲得MenuInflater
            inflater.inflate                           //第一個參數菜單的資源id,第二個參數Menu
                    (sMenuExampleResources[mSpinner.getSelectedItemPosition()], menu);
            // ......省略部分內容
            return true;
        }

onOptionsItemSelected()的處理過程和不使用XML文件的方法相同。只是其中MenuItem的id來自于XML文件中的定義。

2.5.2 對話框的使用

在GUI程序中,有時需要彈出對話框來提示一些信息。這些對話框比一個獨立的屏幕簡單。在Android中彈出式對話框不同于表示一個屏幕的活動,它通常用于簡單的功能處理。對話框可以設置標題、圖標、最多三個按鈕,其主要內容區域可以是提示信息、列表、單選按鈕、復選框,甚至可以設置一個布局文件到其中。

在一個Activity中,實現方法是繼承onCreateDialog()方法,返回一個Dialog類型:

        protected Dialog onCreateDialog(int id)

準備對話框的方法如下所示:

        protected void onPrepareDialog(int id, Dialog dialog)

對于一個id的對話框,onCreateDialog()會被調用一次,在每次對話框出現的時候,將調用onPrepareDialog()。

對話框的顯示和取消如下所示:

        public final void showDialog (int id)        // 顯示對話框
        public final void dismissDialog (int id)    // 取消對話框

當顯示的時候需要調用showDialog(),讓菜單消失使用dismissDialog()。以上的幾個方法中,統一的內容是對話框的id。

android.app包中的Dialog實現了DialogInterface接口,其中幾個方法如下所示:

        public void show()         // 顯示對話框
        public void hide()         // 隱藏對話框
        public void dismiss()      // 消失對話框
        public void cancel()       // 取消對話框(比cancel()多調用一個注冊的取消接口)

以下的幾個接口用于處理對話框中的事件。

DialogInterface.OnCancelListener:取消對話框的事件;

DialogInterface.OnDismissListener:對話框消失的事件;

DialogInterface.OnClickListener:對話框的點擊事件;

DialogInterface.OnKeyListener:對話框的按鍵事件

DialogInterface.OnMultiChoiceClickListener:對話框的多選項目。

幾個接口中,較常使用的是DialogInterface.OnClickListener,它具有如下方法:

        public abstract void onClick (DialogInterface dialog, int which)

這里的onClick()的第一個參數為對話框的句柄,第二個參數表示對話框中的哪一個按鈕發生了事件。

1.AlertDialog的基礎

android.app包中的AlertDialog類是Dialog的主要繼承者,可以用于建立一個提示對話框。AlertDialog.Builder類可以建立AlertDialog,在建立的過程中可以進行多項設置。

setIcon()和setTitle():用于設置圖標和標題;

setMessage():用于設置提示信息;

setPositiveButton()、setNeutralButton()和setNegativeButton():用于設置左、中、右按鈕的相關內容;

setSingleChoiceItems()和setMultiChoiceItems():用于設置單選項和復選項;

setView():用于設置一個View作為對話框的內容。

以上方法的返回類型均為android.app.AlertDialog.Builder,也就是這個類本身,因此可以使用如下的方式進行連續調用,來設置更多的內容。

AlertDialog.Builder中的create()和show()方法分別用于創建和顯示對話框:

        public AlertDialog create ()        // 創建對話框
        public AlertDialog show ()          // 顯示對話框

得到AlertDialog類之后,可以繼續調用其中的方法進行設置工作。

參考示例程序:Dialog(ApiDemo=>App=>Dialog)

源代碼:com/example/android/apis/app/AlertDialogSamples.java

Dialog程序中通過單擊不同按鈕將會啟動不同的對話框,如圖2-13所示。

圖2-13 對話框程序

1. OK Cancel dialog with a message提示信息和兩個按鈕的對話框

2.OK Cancel dialog with a long message提示信息和三個按鈕的對話框

3. List dialog列表項對話框

5. Single choice list單選項和按鈕對話框

6. Repeat alarm復選項和按鈕對話框

8. Text Entry dialog文本的按鍵對話框(使用布局文件)

2.提示信息和按鈕

AlertDialog.Builder的基本功能是設置對話框標題和標識內容的信息,有以下幾個方法:

        public AlertDialog.Builder  setTitle(CharSequence title)       //設置標題
        public AlertDialog.Builder setTitle(int titleId)               //設置標題
        public AlertDialog.Builder setIcon(int iconId)                 //設置圖標
        public AlertDialog.Builder setMessage(CharSequence message)   //設置信息
        public AlertDialog.Builder setMessage(int messageId)          //設置信息

AlertDialog.Builder中的幾個按鈕的設置方法如下所示:

        public AlertDialog.Builder  setPositiveButton(int textId,
                                  DialogInterface.OnClickListener listener)
        public AlertDialog.Builder  setPositiveButton(CharSequence text,
                                  DialogInterface.OnClickListener listener)
        public AlertDialog.Builder  setNeutralButton(int textId,
                                  DialogInterface.OnClickListener listener)
        public AlertDialog.Builder  setNeutralButton(CharSequence text,
                                  DialogInterface.OnClickListener listener)
        public AlertDialog.Builder  setNegativeButton(int textId,
                                  DialogInterface.OnClickListener listener)
        public AlertDialog.Builder  setNegativeButton(CharSequence text,
                                  DialogInterface.OnClickListener listener)

其中PositiveButton表示左按鈕;NeutralButton表示中按鈕;NegativeButton表示右按鈕,只有當以上的幾個方法進行了設置之后,按鈕才會出現。

在對話框程序中,第1個按鈕(OK Cancel dialog with a message)啟動一個提示信息和兩個按鈕的對話框,第2個按鈕(OK Cancel dialog with a long message)啟動一個提示信息和三個按鈕的對話框。運行的效果如圖2-14所示。

圖2-14 提示信息和按鈕運行效果(左:兩個按鈕的對話框;右:三個按鈕和提示信息對話框)

以上的程序核心代碼實現的片段如下所示:

        private static final int DIALOG_YES_NO_MESSAGE = 1;
        private static final int DIALOG_YES_NO_LONG_MESSAGE = 2;
        @Override
        protected Dialog onCreateDialog(int id) {
            switch (id) {
            case DIALOG_YES_NO_MESSAGE:
              return new AlertDialog.Builder(AlertDialogSamples.this)
                  .setIcon(R.drawable.alert_dialog_icon)               // 設置圖標
                  .setTitle(R.string.alert_dialog_two_buttons_title)   // 設置標題
                  .setPositiveButton(R.string.alert_dialog_ok,
                                        new DialogInterface.OnClickListener() {
                      public void onClick(DialogInterface dialog, int whichButton) {
                          // 左鍵處理
                      }
                  })
                  // ......省略左按鈕和右按鈕的設置內容
                  .create();  // 得到AlertDialog
        // ......省略部分內容
            return null;
        }

一個AlertDialog對話框可以直接包含左、中、右三個按鈕,這些按鈕使用DialogInterface.OnClickListener作為接收事件的接口。在對應的onClick()方法中,傳入的第1 個參數DialogInterface表示的是當前對話框的句柄。在第2 個對話框中,由于設置了setMessage(),因此將出現中間的長信息,作為對話框的主要內容。

3.列表項對話框

普通列表項使用AlertDialog.Builder的setItems()方法來完成,如下所示:

        AlertDialog.Builder  setItems(int itemsId,
                                        DialogInterface.OnClickListener listener)
        AlertDialog.Builder  setItems(CharSequence[] items,
                                        DialogInterface.OnClickListener listener)

setItems()方法的第1 個參數為字符串數組(可以使用資源文件表示),第2 個參數為DialogInterface.OnClickListener表示響應事件的方法。

對話框程序的第3個按鈕(List dialog)啟動一個列表項對話框,如圖2-15所示。

圖2-15 列表項對話框(左:列表項對話框;右:單擊列表項后彈出的對話框)

程序將出現一個列表形式的對話框,當單擊其中的一個項目的時候,將出現一個簡單的新對話框。

代碼實現的核心內容如下所示:

        case DIALOG_LIST:
        return new AlertDialog.Builder(AlertDialogSamples.this)
            .setTitle(R.string.select_dialog)
            .setItems(R.array.select_dialog_items,            // 設置對話框的列表項目
                      new DialogInterface.OnClickListener() { // 列表項的響應
              public void onClick(DialogInterface dialog, int which) {
                  String[] items =                            // 獲得屬性數組
                    getResources().getStringArray(R.array.select_dialog_items);
                    new AlertDialog.Builder(AlertDialogSamples.this)   // 建立對話框
                          .setMessage("You selected: " + which + " , " + items[which])
                          .show();                                       // 顯示對話框

}

            })

這里使用了setItems()表示設置幾個不同的項目,從res/values/array.xml文件中取得select_dialog_items的內容,表示一個數組,如下所示:

        <string-array name="select_dialog_items">
            <item>Command one</item>
            <item>Command two</item>
            <item>Command three</item>
            <item>Command four</item>
        </string-array>

由于DialogInterface.OnClickListener接口中的onClick()方法具有一個int型的which參數,根據這個參數可以得到是列表中的哪一個項目被單擊。

這里對每一個列表項目也設置了單擊方法,因此它們被單擊后,也會彈出另一個新的對話框。這里首先使用AlertDialog.Builder建立對話框,然后調用show()方法直接顯示對話框。這個新的對話框沒有標題欄,只顯示一段簡單的文本消息。文本消息中顯示出是哪一個列表項目被單擊了。

4.單選項和復選項對話框

AlertDialog.Builder包含了直接生成單選項和復選框對話框的功能。使用它們建立的對話框的內容區域中,直接表示為單選項和復選框的形式。

單選項主要使用AlertDialog.Builder中的以下幾個方法:

        AlertDialog.Builder  setSingleChoiceItems(CharSequence[] items,
            int checkedItem, DialogInterface.OnClickListener listener)
        AlertDialog.Builder  setSingleChoiceItems(int itemsId,
            int checkedItem, DialogInterface.OnClickListener listener)

復選項主要使用AlertDialog.Builder中的以下幾個方法:

        AlertDialog.Builder  setMultiChoiceItems(CharSequence[] items,
            boolean[] checkedItems, DialogInterface.OnMultiChoiceClickListener listener)
        AlertDialog.Builder  setMultiChoiceItems(int itemsId,
            boolean[] checkedItems, DialogInterface.OnMultiChoiceClickListener listener)

單選項的事件直接使用DialogInterface.OnClickListener接口來進行接收。

多選項的事件使用DialogInterface.OnMultiChoiceClickListener接口用于接收,這個接口中的方法如下所示:

        public abstract void onClick (DialogInterface dialog, int which, boolean isChecked)

單選項需要有整型參數表示哪一個項目被選中,復選項有一個整型數組參數表示哪些項目被選中。因此,對于OnMultiChoiceClickListener的onClick()方法,每更改一個選項,它都會被調用一次,通知項目當前是否被選中(isChecked)。

對話框程序中,按鈕(Single choice list)用于啟動一個單選項和按鈕對話框;按鈕(Repeat alarm)用于啟動一個復選項和按鈕對話框,運行效果如圖2-16所示。

圖2-16 單選項和復選項對話框運行效果

單選項對話框的建立部分如下所示:

        case DIALOG_SINGLE_CHOICE:
            return new AlertDialog.Builder(AlertDialogSamples.this)
              .setIcon(R.drawable.alert_dialog_icon)
              .setTitle(R.string.alert_dialog_single_choice)
              .setSingleChoiceItems(R.array.select_dialog_items2,0, // 設置內容為單選
                  new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int whichButton) {
                          // ......處理單選項變化的內容
                  }
              })
              // ......省略左按鈕和右按鈕的設置內容
              .create();

單選項對話框建立的時候,使用setSingleChoiceItems()的第2個參數(boolean類型)表示初始化之后哪個元素目前被選中了。

復選項對話框的建立部分如下所示:

        case DIALOG_MULTIPLE_CHOICE:
            return new AlertDialog.Builder(AlertDialogSamples.this)
              .setIcon(R.drawable.ic_popup_reminder)
              .setTitle(R.string.alert_dialog_multi_choice)
              .setMultiChoiceItems(R.array.select_dialog_items3, // 設置內容為復選
                      new boolean[]{false, true, false, true, false, false, false},
                      new DialogInterface.OnMultiChoiceClickListener() {
                          public void onClick(DialogInterface dialog, int whicton,
                                  boolean isChecked) {
                          // ......處理復選項變化的內容
                          }
                      })
              // ......省略左按鈕和右按鈕的設置內容
              .create();

復選項對話框建立的時候,使用setMultiChoiceItems ()的第2個參數(boolean數組類型)表示每一個元素的初始化選擇狀態。

在本例中,使用資源文件res/values/array.xml,從中取得select_dialog_items2中的內容作為單選項的項目,從中取得select_dialog_items3中的內容作為復選項的項目。這種取出資源XML文件中的內容,相當于得到了一個CharSequence數組。

5.使用布局文件的對話框

在Android中使用對話框,可以在沒有Activity的情況下建立一個比較簡易的窗體,基本界面可以通過直接設置得到,通過AlertDialog.Builder的setView()可以獲得任意內容的界面,如下所示:

        AlertDialog.Builder  setView(View view)

對話框示例程序的Text Entry dialog按鈕將啟動使用布局的對話框,效果如圖2-17所示。

圖2-17 使用布局文件對話框效果

使用布局文件的對話框的核心代碼實現的片段如下所示:

        case DIALOG_TEXT_ENTRY:
            // This example shows how to add a custom layout to an AlertDialog
            LayoutInflater factory = LayoutInflater.from(this);
            final View textEntryView =   // 從布局文件中解析得到View
                      factory.inflate(R.layout.alert_dialog_text_entry, null);
            return new AlertDialog.Builder(AlertDialogSamples.this)
              .setIcon(R.drawable.alert_dialog_icon)
              .setTitle(R.string.alert_dialog_text_entry)
              .setView(textEntryView)  // 設置View為對話框的內容
          // ......省略左按鈕和右按鈕的設置內容
              })
              .create();

alert_dialog_text_entry.xml也是一個布局文件,其中包含了兩個文本框和兩個可編輯文本,這就是顯示在屏幕上的內容,根據這種模式,也可以在彈出的對話框中使用布局文件。由此,在這個對話框中,包含了這些相應的控件。

2.5.3 標題欄的使用

標題欄通常出現在一個Activity的最上部,標題欄本身也屬于Activity的一部分??梢酝ㄟ^代碼定制標題欄的內容,甚至將標題欄設置成一個布局文件。

標題欄的基本設置可以通過Activity中的以下幾個方法來實現:

        public void setTitle(int titleId)            // 設置標題欄文字
        public void setTitle(CharSequence title)    // 設置標題欄文字
        public void setTitleColor(int textColor)    // 設置標題欄文字顏色

標題欄還可以進行進一步的設置。進一步的設置需要使用android.view包中的Window抽象類。在Activity中使用getWindow()方法獲得其中Window的句柄。

Window中的兩個方法和標題欄的設置相關,如下所示:

        public boolean requestFeature (int featureId)                  // 申請特性
        public abstract void setFeatureInt(int featureId, int value)  // 設置特性

featureId為一個整數,可以使用以下幾個數值和標題欄的設置相關。

FEATURE_NO_TITLE:無標題欄;

FEATURE_PROGRESS和FEATURE_INDETERMINATE_PROGRESS:使用進度條,前者為水平進度條,后者為圓形標志;

FEATURE_LEFT_ICON和FEATURE_RIGHT_ICON:使用圖標;

FEATURE_CUSTOM_TITLE:通過布局文件,自定義標題欄。

自定義標題欄示例程序:(ApiDemo=>App=>CustomTitle)

源文件:com/example/android/apis/app/CustomTitle.java

布局資源文件:custom_title.xml(內容布局)和custom_title_1.xml(標題欄布局)

自定義標題欄程序運行結果如圖2-18所示。

圖2-18 自定義標題欄程序運行結果(左:初始化界面;右:設置后界面)

自定義標題欄程序的核心部分如下所示:

            @Override
            protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);      // 申請特性
              setContentView(R.layout.custom_title);
              getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, // 自定義標題欄特性
                                          R.layout.custom_title_1);
        // 查找布局文件View
              final TextView leftText = (TextView) findViewById(R.id.left_text);
              final TextView rightText = (TextView) findViewById(R.id.right_text);
        // ...... 省略其他的內容
        }

調用requestWindowFeature()和setFeatureInt()設置自定義標題欄,其中setFeatureInt()的第2個參數為布局文件的整型id。

custom_title_1.xml是標題欄使用的布局文件,其內容如下所示:

        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/screen"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <TextView android:id="@+id/left_text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentLeft="true"
              android:text="@string/custom_title_left" />
            <TextView android:id="@+id/right_text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentRight="true"
              android:text="@string/custom_title_right" />
        </RelativeLayout>

在標題欄程序中具有兩個文本,一個靠左,一個靠右,這些就是由custom_title_1文件定義的。使用自定義標題欄的方法,可以將標題欄設置為一個布局文件。當設置完成后,使用Activity的findViewById()方法可以找到標題欄布局文件中的控件。

提示:通常不需要自定義過于復雜的標題欄,當需要復雜的標題區域的時候可以設置為沒有標題欄,所有需要在界面上顯示的內容在布局文件中定義。

主站蜘蛛池模板: 襄樊市| 西和县| 重庆市| 安顺市| 钟祥市| 化州市| 甘泉县| 新疆| 正宁县| 株洲县| 河南省| 商丘市| 奉新县| 开封县| 河南省| 苏尼特左旗| 类乌齐县| 平山县| 比如县| 富顺县| 东港市| 宜兰市| 凤庆县| 上饶县| 宕昌县| 南阳市| 黄龙县| 胶州市| 南郑县| 广丰县| 彩票| 耿马| 瓦房店市| 蓬莱市| 岳阳县| 静宁县| 溧阳市| 湄潭县| 新源县| 辽宁省| 特克斯县|