Android:定製Activity的標題欄(Titlebar)

 缺省的情況下,通常見到Activity的標題欄(Titlebar)是這樣的(紅色框內):


HandleContacts是Activity的標題。

 

有時候,我們希望能改變一下這樣單調的狀況。比如,要在標題欄中增加一個用於美化界面的圖標、增一個輸入框或按鈕之類的,怎樣才能做到這一點呢?我們不妨來看一個實際的例子。

 

1.    首先如下創建一個Android項目

 

2.    將圖片magnifier.png拖入該項目的res/drawable-mdpi文件夾下。magnifier.png圖片的樣子是這樣的:


3.    在該項目的res/layout文件夾下,創建一個佈局titlebar.xml,這個佈局將用於定製Activity的標題欄


編輯titlebar.xml,使其內容如下:

<?xmlversion="1.0" encoding="utf-8"?>

<LinearLayout

       xmlns:android="http://schemas.android.com/apk/res/android"

       android:orientation="horizontal"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content">

      

       <ImageView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:src="@drawable/magnifier"

                android:gravity="bottom"

       />

       <TextView

                 android:layout_width="wrap_content"

                 android:layout_height="38dip"

                 android:text="@string/app_name"

                 android:textColor="#FFFFFFFF"

                 android:textSize="14dip"

                 android:paddingTop="1dip"

       />

      

       <EditText

                   android:id="@+id/searchparameter"

                   android:layout_width="wrap_content"

                   android:layout_height="38dip"

                   android:text="ABCDEFGHIJ"

                   android:textSize="14dip"

                   android:layout_margin="1dip"

         />

        

         <Button android:id="@+id/button"

                   android:layout_width="wrap_content"

                   android:layout_height="38dip"

                   android:text="OK"

                   android:textSize="14dip"

         />

</LinearLayout>

 

在上面的LinearLayout中,增加了以下控件:

一個ImageView,用於顯示一個圖標

一個TextView,用於顯示應用的名稱

一個EditText,用於接收輸入

一個Button,用於測試

 

4.    修改CustomizeTitlebar.java,使之如下:

public class CustomizeTitlebar extends Activity

{

    @Override

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

    }

}

以上加粗的兩行很重要,而且必須要嚴格按照上面那樣的順序出現在代碼中。即:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);必須出現在super.onCreate(savedInstanceState);之後,setContentView(R.layout.main);之前。其意思就是告訴系統,本程序要自己定義Titlebar;

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.titlebar); 則必須出現在setContentView之後,其意思就是告訴系統,自定義的佈局是R.layout.titlebar(即,我們前面編寫的titlebar.xml)

 

到這裏,不妨來運行一下,看看結果如何:


我們看到,Titlebar基本上按照我們的意思進行了改變,但也存在着一個缺陷:Titlebar太窄了,那麼怎樣改變Titlebar的高度呢?

 

5.    要改變Titlebar的高度,我們得先創建styles.xml:


編輯styles.xml,使其內容如下:

<?xmlversion="1.0" encoding="utf-8"?>

<resources>

         <style name="titlebarstyle" parent="android:Theme">

                   <item name="android:windowTitleSize">38dip</item>

         </style>

</resources>

上面<item name="android:windowTitleSize">39dip</item>這一句,就是用來設定Titlebar的高度的。

 

6.    在上面的基礎上,我們需要修改AndroidManifest.xml中,相應Activity的屬性。如下:

<?xmlversion="1.0" encoding="utf-8"?>

<manifestxmlns:android="http://schemas.android.com/apk/res/android"

      package="com.pat.customizetitlebar"

      android:versionCode="1"

      android:versionName="1.0">

    <application android:icon="@drawable/icon"android:label="@string/app_name">

        <activity android:name=".CustomizeTitlebar"

                  android:label="@string/app_name"

                  android:theme="@style/titlebarstyle">

            <intent-filter>

                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>

            </intent-filter>

        </activity>

 

    </application>

    <uses-sdk android:minSdkVersion="8"/>

 

</manifest>

注意粗體字是新增上去的,其中的titlebar是在第5步中增加的。現在來看看運行結果:

 

可以看到結果完全符合了我們的要求。

 

7.    我們還可以改變Titlebar的背景顏色。爲此我們修改前面的styles.xml,使之如下:

<?xml version="1.0" encoding="utf-8"?>

<resources>

<style name="CustomizedWindowTitleBackgroundColor">

           <item name="android:background">#047BF0</item>

</style>

<style name="titlebarstyle" parent="android:Theme">

           <item name="android:windowTitleSize">38dip</item>

           <item name="android:windowTitleBackgroundStyle">@style/CustomizedWindowTitleBackgroundColor</item>

</style>

</resources>

注意,其中的粗體字是新增加的。

項目其他文件,均無需變動。運行結果如下:

 

8.    最後,我們以OK按鈕爲例來測試Titlebar上的控件的事件響應。爲此,修改CustomizeTitlebar.java,使之如下:

public class CustomizeTitlebar extends Activity

implements

OnClickListener

{

     private Button button;

    @Override

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

       

        button = (Button)findViewById(R.id.button);

        button.setOnClickListener(this);

    }

   

   public voidonClick(View v)

   {

           if(v.getId() == R.id.button)

           {

                    Toast.makeText(this, "OK button in Titlebar clicked...", Toast.LENGTH_LONG).show();

           }

   }

}

粗體字部分是新增加的代碼。重新運行本項目,等界面出來後,點擊Titlebar上的OK按鈕,將出現:


這說明,Titlebar上自己增加上去的控件,可以很好地響應相關的事件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章