【Android Demo】自定義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上自己增加上去的控件,可以很好地響應相關的事件。

 

 

來源: http://blog.csdn.net/pathuang68/article/details/6646792


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM