常見自訂titlebar的方法是在values檔案夾中建立一個我們自己的titlebar主題,例如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TitlebarBackgroundStyle">
<item name="android:background">@drawable/titlebar</item>
</style>
<style name="Theme.MyCustomTheme" parent="android:Theme">
<item name="android:windowTitleBackgroundStyle">@style/TitlebarBackgroundStyle</item>
<item name="android:windowTitleSize">45dp</item>
</style>
</resources>
然後在manifest檔案中為activity添加自訂佈景主題,
<activity android:name=".MyTitleBar"
android:label="@string/app_name"
android:theme="@style/Theme.MyCustomTheme" //注意添加與此
這樣就基本上完成了自訂titlebar。
聲明無標題列的方法更簡單就是直接在activity中添加語句
requestWindowFeature(Window.FEATURE_NO_TITLE);
但是無論是通過上面代碼定義無標題列的activity,還是通過自訂佈景主題重寫titlebar,app首次載入時,系統總是會閃現一下app_name,然後才會運行我們定義的titlebar行為。這是一個令人詭異的行為。那麼怎麼去除app_name呢?
首先我們來看一下android運行app的基本原理:在系統運行一個application時,為了儘快響應使用者,android首先會給使用者 呈現一個app的“preview”視窗,這個介面甚至早於應用的實際進程。這個預覽“preview”視窗中的資訊就是從app的manifest檔案 中獲得的,所以一般app運行時總會顯示一個具有app_name的titlebar,而不論我們在程式中如何定義我們的titlebar。所以解決的辦 法來了。
首先我們可以在app的manifest檔案中,給我們的main activity添加無標題列的主題
android:theme="@android:style/Theme.NoTitleBar"
聲明我們的app根本不需要titlebar,這樣app首次載入便不會閃現一下帶有app_name的titlebar了。這比
requestWindowFeature(Window.FEATURE_NO_TITLE);
好使得多。但是問題來了,如果我還想要app呈現我自訂的標題列怎麼辦呢?
解決的辦法是在需要自訂titlebar的activity中通過
setTheme(android.R.style.Theme);
聲明回標題列。
需要注意的是setTheme(android.R.style.Theme);語句需要放在oncreat()語句的最前面否則會報錯的。例如:
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- setTheme(R.style.MyCustomTheme);//注意這一句的位置
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
- setContentView(R.layout.progressbar_test);
- getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, // 注意順序
- R.layout.title); 風之境地 java-javascript 蘑菇街女裝
這樣運行期間系統就會直接運行我們定義的標題列,而不是先短暫的呈現app_name,再呈現我們的標題列特徵。