AndroidUI開發(fā)第二十四篇——ActionBar

   Action bar是一個標(biāo)識應(yīng)用程序和用戶位置的窗口功能,并且給用戶提供操作和導(dǎo)航模式。在大多數(shù)的情況下,當(dāng)你需要突出展現(xiàn)用戶行為或全局導(dǎo)航的activity中使用action bar,因為action bar能夠使應(yīng)用程序給用戶提供一致的界面,并且系統(tǒng)能夠很好根據(jù)不同的屏幕配置來適應(yīng)操作欄的外觀。你能夠用ActionBar的對象的API來控制操作欄的行為和可見性,這些API被添加在Android3.0(API 級別 11)中。

成都創(chuàng)新互聯(lián)服務(wù)項目包括樂東黎族網(wǎng)站建設(shè)、樂東黎族網(wǎng)站制作、樂東黎族網(wǎng)頁制作以及樂東黎族網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,樂東黎族網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到樂東黎族省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

      Action bar的主要目的是:

        1.  提供一個用于識別應(yīng)用程序的標(biāo)示和用戶的位置的專用空間。

         這個空間的左邊是應(yīng)用的圖標(biāo)或logo,以及Activity的標(biāo)題。但是,如果是像當(dāng)前選擇的標(biāo)簽這樣的標(biāo)識當(dāng)前View對象的導(dǎo)航標(biāo)簽,你可以選擇刪除Activity的標(biāo)題。

        2.  在不同的應(yīng)用程序之間提供一致的導(dǎo)航和視覺體驗。

        Action bar提供了用于Fragment間切換的內(nèi)置導(dǎo)航標(biāo)簽。它還提供了一個用于替換導(dǎo)航模式或優(yōu)化當(dāng)前視覺效果(如按照不同條件排序的列表)的下拉列表。

        3.  突出Activity的關(guān)鍵操作(如“搜索”、“創(chuàng)建”、“共享”等),并且在可預(yù)見的方法內(nèi)給用戶提供快捷的訪問。

       對于關(guān)鍵的用戶操作,你能夠通過把選項菜單項作為操作項直接放到操作欄中,從而提供快捷的訪問。操作項目還能提供一個操作窗口,這個窗口給更直接的操作行為提供一個嵌入的窗口部件。沒有改進成操作項的菜單項在溢出菜單中還是有效的,用戶既可以使用設(shè)備上的菜單按鈕(設(shè)備上有按鈕的時候),也可以使用操作欄中的溢出菜單按鈕(當(dāng)設(shè)備上不包含菜單按鈕時)來顯示這些操作項目。

       上面的總結(jié)一下:Action bar就是替換3.0以前的tittle bar和menu。

             Android UI開發(fā)第二十四篇——Action Bar

        圖1. Honeycomb Gallery應(yīng)用中的操作欄,從左邊開始,依次是logo、導(dǎo)航選項標(biāo)簽和操作項(在右邊插入的一個懸浮菜單按鈕)。

         Note: If you're looking for information about the contextual action bar for displaying contextual action items, see the Menu guide.

        Action Bar Design   For design guidelines, read Android Design's Action Bar guide.

添加Action Bar

       從Android3.0(API級別 11)開始,Action bar被包含在所有的使用Theme.Hole主題的Activity(或者是這些Activity的子類)中,當(dāng)targetSdkVersion或minSdkVersion屬性被設(shè)置為“11”或更大的數(shù)值是,這個主題是默認(rèn)的主題一。如:

  1. <manifest ... >  
        <uses-sdk android:minSdkVersion="4"  
                  android:targetSdkVersion="11" />  
        ...  
    </manifest>

   在這個例子中,應(yīng)用程序要求最小的API版本級別是4(Android 1.6),但是它還要求了目標(biāo)API版本級別是11(Android 3.0)。這樣,當(dāng)應(yīng)用程序運行在Android3.0或更高的版本上時,系統(tǒng)就會給每個Activity應(yīng)用holographic  主題,這樣,每個Activity就會包含Action bar。

        如果你想使用ActionBar API來進行添加導(dǎo)航模式和修改操作欄樣式的操作,你應(yīng)該把minSdkVersion屬性設(shè)置為“11”或更大的值。有一些方法可以使你的應(yīng)用支持更舊的Android版本,同時在API等級為11或更高的API等級的機器的使你的應(yīng)用支持一些Action bar apis。為了保持后向兼容,請參考邊框內(nèi)的內(nèi)容(邊框內(nèi)容如下)。

Remaining backward-compatible

If you want to provide an action bar in your application and remain compatible with versions of Android older than 3.0, you need to create the action bar in your activity's layout (because theActionBar class is not available on older versions).

To help you, the Action Bar Compatibility sample app provides an API layer and action bar layout that allows your app to use some of theActionBar APIs and also support older versions of Android by replacing the traditional title bar with a custom action bar layout.

刪除Action bar

      如果你不想要Action bar,把Activity的主題設(shè)置為Theme.Holo.NoActionBar就可以了,如:

<
activity android:theme = "@android:style/Theme.Holo.NoActionBar"
>

或者使用Action bar的 hide()方法,如下:

  1. ActionBar actionBar = getActionBar();  
    actionBar.hide();

  當(dāng)Action bar隱藏時,系統(tǒng)會調(diào)整你的Activity來填充當(dāng)前有效的屏幕空間。你能夠使用show()方法來再次顯示操作欄。

      在隱藏和刪除Action bar時,要當(dāng)心為了適應(yīng)被Action bar占用的空間而導(dǎo)致的Activity的重新布局。如果你的Activity有規(guī)律的隱藏和顯示Action bar,你可能想要使用覆蓋模式。覆蓋模式在Activity的頂部描畫操作欄,而不是在它們所擁有的屏幕的區(qū)域。這樣,在Action bar隱藏和重新顯示時,你的布局保持不變。要使用覆蓋模式,就要給Activity創(chuàng)建一個主題,并且把android:windowActionBarOverlay屬性設(shè)置為true。

       提示:如果你有一個刪除了Action bar的定制化的Activity主題,它把android:windowActionBar樣式屬性設(shè)置為false。但是,如果你使用了刪除Action bar的一個主題,那么,創(chuàng)建窗口將不允許Action bar再顯示,因此,你不能在以后給這個Activity添加Action bar---因為getActionBar()方法將返回null。


添加操作項

       有些時候,你可能想要讓用戶直接訪問選項菜單中的一個項目,因此你要把應(yīng)該在Action bar中顯示的菜單項作為一個操作項來聲明。操作項能夠能夠包含一個圖標(biāo)或文本標(biāo)題。如果一個菜單項不作為一個操作項顯示,那么系統(tǒng)就會把它放到懸浮菜單中。懸浮菜單既可以通過設(shè)備的Menu按鈕來顯示,也可以在Action bar中一個額外的按鈕來顯示。

       當(dāng)Activity首次啟動時,系統(tǒng)會調(diào)用onCreateOptionsMenu()方法給你的Activity組裝Action bar和懸浮菜單。在這個回調(diào)方法中應(yīng)該加載在XML文件中定義的菜單項資源,如:

  1. @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        MenuInflater inflater = getMenuInflater();  
        inflater.inflate(R.menu.main_activity, menu);  
        return true;  
    }

             Android UI開發(fā)第二十四篇——Action Bar

         圖2. 帶有圖標(biāo)和文本標(biāo)題的兩個操作項,和懸浮菜單按鈕。

       在XML文件中,你能夠通過給<item>元素聲明android:showAsAction=”ifRoom”屬性,請求把一個菜單項作為一個操作項來顯示。用這種方式,只在有有效的空間時,菜單項才能顯示在Action bar中。如果沒有足夠的空間,這個菜單項會顯示在懸浮菜單中。

        如果你的菜單項支持標(biāo)題和圖標(biāo)---帶有android:title和android:icon屬性---那么默認(rèn)情況下,操作項僅顯示圖標(biāo)。如果你要顯示文本標(biāo)題,就要給android:showAsAction屬性添加withText設(shè)置,如:

  1. <?xml version="1.0" encoding="utf-8"?>  
    <menu xmlns:android="http://schemas.android.com/apk/res/android">  
        <item android:id="@+id/menu_save"  
              android:icon="@drawable/ic_menu_save"  
              android:title="@string/menu_save"  
              android:showAsAction="ifRoom|withText" />  
    </menu>

提示:withText值示意Action bar要顯示文本標(biāo)題。Action bar會盡可能的顯示這個標(biāo)題,但是,如果圖標(biāo)有效并且受到Action bar空間的限制,文本標(biāo)題有可能顯示不全。

當(dāng)用戶選擇了一個操作項時,Activity會接收一個onOptionsItemSelected()的回調(diào),要把android:id屬性支持的ID傳遞給這個方法。

給每個菜單項定義android:title屬性是至關(guān)重要的,即使你沒有給操作項聲明標(biāo)題。原因如下:

1.  如果Action bar中沒有足夠的空間來顯示操作項,那么菜單項就會顯示在懸浮菜單中,并僅顯示標(biāo)題;

2.  屏幕閱讀器要給視障用戶朗讀菜單項標(biāo)題;

3.  如果僅用圖標(biāo)來顯示操作項,那么,用戶能夠長按這個項目,用操作項的標(biāo)題來顯示提示信息。

注意:如果你添加源于Fragment對象的菜單項,那么通過Fragment類的onCreateOptionsMenu onCreateOptionsMenu回調(diào)方法,當(dāng)用戶選擇其中一個Fragment菜單項時,系統(tǒng)會對用那個Fragment對象對應(yīng)的onOptionsItemSelected()方法。但是,Activity有機會首先處理這個事件,因為系統(tǒng)在調(diào)用對應(yīng)的Fragment對象的onOptionsItemSelected()方法之前會調(diào)用Activity的相同的回調(diào)方法。

       你也能夠聲明一個菜單項,讓它始終作為操作項來顯示,而不是在空間不足時就放到懸浮菜單中。大多數(shù)情況下,你不應(yīng)該使用always屬性值來強制一個菜單項始終顯示在操作欄中,但是,當(dāng)提供了一個不給懸浮菜單提供默認(rèn)操作的操作窗口時,你就需要始終顯示一個菜單項。但是要警惕,太多的操作項會創(chuàng)建一個混亂的UI,并且會導(dǎo)致窄屏設(shè)備上的布局問題。最好的方法是使用ifRoom屬性值,它允許系統(tǒng)在操作欄空間不足的時候,把菜單項移到懸浮菜單中。

選擇操作項:

       通過評估一些關(guān)鍵的特性,你應(yīng)該仔細(xì)的選擇選項菜單中的那些菜單項應(yīng)該作為操作項來顯示,通常,每個操作項應(yīng)該至少滿足下列特性之一:

        1.  經(jīng)常使用:用戶百分之七十以上的訪問都需要使用的操作,或者是要連續(xù)的多次使用的操作。

        2.  重要:它是一個用戶能夠很容易找到的操作,即使它不是經(jīng)常性的操作,也需要用戶在需要的時候能夠輕易的找到它,并執(zhí)行。

             如,Wi-Fi設(shè)置中的添加網(wǎng)絡(luò)等。

        3.  典型:它是一些類似應(yīng)用程序的操作欄中提供的典型操作,因此,用戶都期望在操作欄中能夠找到它。

            如,電子郵件或社交應(yīng)用程序中的“刷新”操作。

        如果你想要把四個以上的菜單項調(diào)整為操作項,那么你就應(yīng)該認(rèn)真考慮一下他們相對的重要性級別,并且嘗試不要超過四個以上的操作項設(shè)置(并且還有使用“ifRoom”屬性值的設(shè)置,允許系統(tǒng)在遇到空間受限的比較小的屏幕的時候,能夠把靠后的操作項放到懸浮菜單中)。即使在一些寬屏設(shè)備上,空間充足,你也不應(yīng)該創(chuàng)建很多操作項,這樣會擾亂UI的布局,而且更像一個桌面工具欄,因此要保持最小數(shù)量的操作項。

       另外,以下操作應(yīng)該永遠(yuǎn)不要作為操作項來顯示:設(shè)置、幫助、意見反饋、或類似的操作。要把它們始終保留在懸浮菜單中。

       注意:不是所有的設(shè)備都給檢索提供了專有的硬件按鈕,因此,如果是你應(yīng)用程序中的一個重要功能,它應(yīng)該始終作為一個操作項來顯示(而且通常要把放到第一項的位置,尤其是操作窗口中提供這個操作的時候)。

使用分離式操作欄

        當(dāng)你的應(yīng)用程序正在Android4.0(API 級別 14)或以上的版本上運行,那么還有一種叫做“分隔操作欄”的額外模式對action bar有效。當(dāng)你啟用分隔操作欄模式時,在屏幕的底部會顯示一個獨立的橫條,用于顯示Activity在窄屏設(shè)備(如豎屏手機)上運行時的所有操作項。

       把action bar分隔成獨立的操作項,確保在窄屏設(shè)備上有合適的空間來顯示所有的操作項,同時把導(dǎo)航條和標(biāo)題元素留在頂部。

       要啟用分離式操作欄,只需簡單的在<application>或<activity>元素中添加uiOptions=”splitActionBarWhenNarrow”屬性設(shè)置就可以了。

       要注意,Android會基于當(dāng)前屏幕的尺寸用各種方式來調(diào)整操作欄的外觀。使用分離式操作欄只是你能夠啟用的允許操作欄針對不同屏幕尺寸來進一步優(yōu)化用戶體驗的選項之一。你還可以允許操作欄把導(dǎo)航選項標(biāo)簽折疊到主操作欄中,如果你在操作欄中使用導(dǎo)航選項標(biāo)簽,那么一旦操作項在窄屏設(shè)備上被分離,這些導(dǎo)航選項標(biāo)簽就可能填充到主操作欄中,而不是被分離到堆疊起來的操作欄。尤其是如果你禁用了操作欄的圖標(biāo)和標(biāo)題(用setDisplayShowHomeEnabled(false)和setDisplayShowTitleEnabled(false)方法),那么導(dǎo)航選項標(biāo)簽就會折疊到主操作欄中,如下圖3中第二個設(shè)備的顯示:

                       Android UI開發(fā)第二十四篇——Action Bar

圖3. 左側(cè)是帶有導(dǎo)航選項標(biāo)簽的分離式操作欄,右側(cè)是禁用了應(yīng)用圖標(biāo)和標(biāo)題的分離式操作欄。

注意:盡管android:uiOptions屬性在Android4.0(API 級別 14)中才被添加,但是為了保持跟Android的低版本的兼容性,即使你的minSdkVersion屬性值小于14,那么你的應(yīng)用程序也可以安全的包含android:uiOptions屬性。在舊版本上運行時,因為系統(tǒng)不能理解這個屬性,所以只是簡單的忽略了這個XML屬性。在你的清單文件中包含這個屬性的唯一條件是,你必須在支持API級別14或更高以上版本的平臺上編譯你的應(yīng)用程序。為了保持兼容性,你不能在你的應(yīng)用程序代碼中使用由minSdkVersion屬性聲明的版本所不支持的API,只有XML屬性才能被舊的平臺版本安全的忽略。

導(dǎo)航欄使用應(yīng)用圖標(biāo)

       默認(rèn)情況下,應(yīng)用程序圖標(biāo)顯示在操作欄的左邊。你能夠把這個圖標(biāo)當(dāng)做操作項來使用。應(yīng)用程序應(yīng)該在這個圖標(biāo)上響應(yīng)以下兩個操作之一:

       1.  返回應(yīng)用程序的“主”Activity;

       2.  向應(yīng)用程序上級頁面導(dǎo)航。

       當(dāng)用戶觸摸這個圖標(biāo)時,系統(tǒng)會調(diào)用Activity帶有android.R.id.home ID的onOptionsItemSelected()方法。在這個響應(yīng)中,你既可以啟動主Activity,也可以返回你的應(yīng)用程序結(jié)構(gòu)化層次中用戶上一步操作的界面。

       如果你要通過應(yīng)用程序圖標(biāo)的響應(yīng)來返回主Activity,那么就應(yīng)該在Itent對象中包括FLAG_ACTIVITY_CLEAR_TOP標(biāo)識。用這個標(biāo)記,如果你要啟動的Activity在當(dāng)前任務(wù)中已經(jīng)存在,那么,堆棧中這個Activity之上的所有的Activity都有被銷毀,并且把這個Activity顯示給用戶。添加這個標(biāo)識往往是重要的,因為返回主Activity相當(dāng)與一個回退的動作,因此通常不應(yīng)該再創(chuàng)建一個新的主Activity的實例,否則,最終可能會在當(dāng)前任務(wù)中產(chǎn)生一個很長的擁有多個主Activity的堆棧。

例如,下例的onOptionsItemSelected()方法實現(xiàn)了返回應(yīng)用程序的主Activity的操作:

  1. @Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
        switch (item.getItemId()) {  
            case android.R.id.home:  
                // app icon in action bar clicked; go home  
                Intent intent = new Intent(this, HomeActivity.class);  
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
                startActivity(intent);  
                return true;  
            default:  
                return super.onOptionsItemSelected(item);  
        }  
    }

在用戶從另一個應(yīng)用程序進入當(dāng)前Activity的情況下,你可能還想要添加FLAG_ACTIVITY_NEW_TASK標(biāo)識。這個標(biāo)識確保在用戶返回主頁或上級頁面時,新的Activity不會被添加到當(dāng)前的任務(wù)中,而是在屬于你自己的應(yīng)用程序的任務(wù)中啟動。例如,如果用戶通過被另一個應(yīng)用程序調(diào)用的Intent對象啟動了你的應(yīng)用程序中的一個Activity,那么選擇操作欄圖標(biāo)來返回主頁或上級頁面時,F(xiàn)LAG_ACTIVITY_CLEAR_TOP標(biāo)識會在屬于你的應(yīng)用程序的任務(wù)中啟動這個Activity(不是當(dāng)前任務(wù))。系統(tǒng)既可以用這個新的Activity做根Activity來啟動一個新的任務(wù),也可以把存在后臺的擁有這個Activity實例的一個既存任務(wù)帶到前臺來,并且目標(biāo)Activity會接受onNewIntent()回調(diào)。因此,如果你的Activity要接收另一個應(yīng)用程序的Intent對象,那么通常應(yīng)該給這個Intent對象添加FLAG_ACTIVITY_NEW_TASK標(biāo)識,如:

[java] view plaincopyprint?Android UI開發(fā)第二十四篇——Action BarAndroid UI開發(fā)第二十四篇——Action Bar

  1. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);  


注意:如果你要使用應(yīng)用圖標(biāo)來返回主頁,要注意從Android4.0(API 級別 14)開始,必須通過調(diào)用setHomeButtonEnabled(true)方法確保這個圖標(biāo)能夠作為一個操作項(在以前的版本,默認(rèn)情況下,這個圖標(biāo)就能夠作為一個操作項)。

向應(yīng)用程序上級頁面導(dǎo)航

       作為傳統(tǒng)的回退導(dǎo)航(把用戶帶回任務(wù)歷史中的前一個窗口)的補充,你能夠讓action bar圖標(biāo)提供向上級頁面導(dǎo)航的功能,它應(yīng)用把用戶帶回到你的應(yīng)用程序的上級頁面。例如,當(dāng)前頁面時你的應(yīng)用程序?qū)哟伪容^深的一個頁面,觸摸應(yīng)用程序圖標(biāo)應(yīng)該返回返回上一級頁面(當(dāng)前頁面的父頁面)。

          Android UI開發(fā)第二十四篇——Action Bar

         圖4. Email應(yīng)用程序的標(biāo)準(zhǔn)圖標(biāo)(左)和向上導(dǎo)航圖標(biāo)(右)。系統(tǒng)會自動添加向上指示。

       例如,圖5演示了當(dāng)用戶從一個應(yīng)用程序?qū)Ш降揭粋€屬于不同應(yīng)用程序的Activity時,“回退”按鈕的行為。

            Android UI開發(fā)第二十四篇——Action Bar

       但是,如果在編輯完郵件之后,想要停留在Email應(yīng)用程序中,那么向上導(dǎo)航就允許你把用戶導(dǎo)航到Email應(yīng)用程序中編輯郵件頁面的上級頁面,而不是返回到前一個Activity。圖6演示了這種場景,在這個場景中,用戶進入到Email應(yīng)用程序后,不是按回退按鈕,而是按操作欄圖標(biāo)來向上導(dǎo)航。

       Android UI開發(fā)第二十四篇——Action Bar

         圖6. 從People應(yīng)用進入Email應(yīng)用后,向上導(dǎo)航的行為。

         要是應(yīng)用程序圖標(biāo)能夠向上導(dǎo)航,就要在你的ActionBar中調(diào)用SetDisplayHomeAsUpEnabledtrue(true)方法。

  1. protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
      
        setContentView(R.layout.main);  
        ActionBar actionBar = getActionBar();  
        actionBar.setDisplayHomeAsUpEnabled(true);  
        ...  
    }

   當(dāng)用戶觸摸這個圖標(biāo)時,系統(tǒng)會調(diào)用帶有android.R.id.home ID的onOptionsItemSelected()方法。

       請記住要在Intent對象中使用FLAG_ACTIVITY_CLEAR_TOP標(biāo)識,以便你不會這個父Activity存在的情況下,再創(chuàng)建一個新的實例。例如,如果你不使用FLAG_ACTIVITY_CLEAR_TOP標(biāo)識,那么向上導(dǎo)航后,再按回退按鈕,實際上會把用戶帶到應(yīng)用程序的下級頁面,這是很奇怪的。

注意:如果有很多用戶能夠到達應(yīng)用程序中當(dāng)前Activity的路徑,那么,向上圖標(biāo)應(yīng)該沿著當(dāng)前Activity的實際啟動路徑逐步的向會導(dǎo)航。

添加操作視窗

       操作視窗是作為操作項目按鈕的替代品顯示在操作欄中的一個可視構(gòu)件。例如,如果你有一個用于搜索的可選菜單項,你可以用SearchView類來替代操作欄上的搜索按鈕,如圖7所示:

             Android UI開發(fā)第二十四篇——Action Bar

       圖7. 折疊(上)和展開(下)的搜索視窗的操作欄

       要個菜單資源中的一個項目聲明一個操作視窗,你既可以使用android:actionLayout屬性也android:actionViewClass屬性來分別指定一個布局資源或要使用的可視構(gòu)件類。例如:

  1. <?xml version="1.0" encoding="utf-8"?>  
    <menu xmlns:android="http://schemas.android.com/apk/res/android">  
        <item android:id="@+id/menu_search"  
              android:title="@string/menu_search"  
              android:icon="@drawable/ic_menu_search"  
              android:showAsAction="ifRoom|collapseActionView"  
              android:actionViewClass="android.widget.SearchView" />  
    </menu>

android:showAsAction屬性也可包含“collapseActionView”屬性值,這個值是可選的,并且聲明了這個操作視窗應(yīng)該被折疊到一個按鈕中,當(dāng)用戶選擇這個按鈕時,這個操作視窗展開。否則,這個操作視窗在默認(rèn)的情況下是可見的,并且即便在用于不適用的時候,也要占據(jù)操作欄的有效空間。

       如果需要給操作視窗添加一些事件,那么就需要在onCreateOptionsMenu()回調(diào)執(zhí)行期間做這件事。你能夠通過調(diào)用帶有菜單項ID的findItem()方法來獲取菜單項,然后再調(diào)用getActionView()方操作視窗中的元素。例如,使用以下方法獲取上例中的搜索視窗構(gòu)件。

  1. @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        getMenuInflater().inflate(R.menu.options, menu);  
        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();  
        // Configure the search info and add any event listeners  
        ...  
        return super.onCreateOptionsMenu(menu);  
    }

處理可折疊的操作視窗

        操作視窗讓你在不改變Activity或Fragment的情況下,就可以給用戶提供快捷的訪問和豐富的操作。但是,默認(rèn)情況下讓操作視窗可見可能不太合適。要保證操作欄的空間(尤其是在小屏幕設(shè)備上運行時),你能夠把操作視窗折疊進一個操作項按鈕中。當(dāng)用戶選擇這個按鈕時,操作視窗就在操作欄中顯示。被折疊的時候,如果你定義了android:showAsAction=”ifRoom”屬性,那么系統(tǒng)可能會把這個項目放到溢出菜單中,但是當(dāng)用戶選項了這個菜單項,它依然會顯示在操作欄中。通過給android:showAsAction屬性添加“collapseActionView”屬性值,你能夠讓操作視窗可以折疊起來。

        因為在用戶選擇這個項目時,系統(tǒng)會展開這個操作視窗,所以你不必要在onOptionsItemSelected()回調(diào)方法中響應(yīng)這個菜單項。在用戶選擇這個菜單項時,系統(tǒng)會依然調(diào)用onOptionsItemSelected()方法,但是除非你在方法中返回了true(指示你已經(jīng)替代系統(tǒng)處理了這個事件),否則系統(tǒng)會始終展開這個操作視窗。

       當(dāng)用戶選擇了操作欄中的“向上”圖標(biāo)或按下了回退按鈕時,系統(tǒng)也會把操作視窗折疊起來。

如果需要,你能夠在代碼中通過在expandActionView()和collapseActionView()方法來展開或折疊操作視窗。

       注意:盡管把操作視窗折疊起來是可選的,但是,如果包含了SearchView對象,我們推薦你始終把這個視窗折疊起來,只有在需要的時候,由用戶選擇后才把它給展開。在提供了專用的“搜索”按鈕的設(shè)備上也要小心了,如果用戶按下了“搜索”按鈕,那么也應(yīng)該把這個搜索視窗給展開,簡單的重寫Activity的onKeyUp()回調(diào)方法,監(jiān)聽KEYCODE_SEARCH類型的按鍵事件,然后調(diào)用expandActionView()方法,就可以把操作視窗給展開。

如果你需要根據(jù)操作視窗的可見性來更新你的Activity,那么你可以定義一個OnActionExpandListener事件,并且用setOnActionExpandListener()方法來注冊這個事件,然后就能夠在操作視窗展開和折疊時接受這個回調(diào)方法了,如:

  1. @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        getMenuInflater().inflate(R.menu.options, menu);  
        MenuItem menuItem = menu.findItem(R.id.actionItem);  
        ...  
      
        menuItem.setOnActionExpandListener(new OnActionExpandListener() {  
            @Override  
            public boolean onMenuItemActionCollapse(MenuItem item) {  
                // Do something when collapsed  
                return true;  // Return true to collapse action view  
            }  
      
            @Override  
            public boolean onMenuItemActionExpand(MenuItem item) {  
                // Do something when expanded  
                return true;  // Return true to expand action view  
            }  
        });  
    }

添加一個操作提供器

       與操作視窗類似,操作提供器(由ActionProvider類定義的)用一個定制的布局代替一個操作項目,它還需要對所有這些項目行為的控制。當(dāng)你在操作欄中給一個菜單項聲明一個操作項目時,它不僅要一個定制的布局來控制這個菜單項的外觀,而且當(dāng)它在顯示在溢出菜單中時,還要處理它的默認(rèn)事件。無論是在操作欄中還是在溢出菜單中,它都能夠提供一個子菜單。

       例如,ActionProvider的擴展類ShareActionProvider,它通過在操作欄中顯示一個有效的共享目標(biāo)列表來方便共享操作。與使用傳統(tǒng)的調(diào)用ACTION_SEND類型Intent對象的操作項不同,你能夠聲明一個ShareActionProvider對象來處理一個操作項。這種操作提供器會保留一個帶有處理ACTION_SEND類型Intent對象的應(yīng)用程序的下拉列表,即使這個菜單項顯示在溢出菜單中。因此,當(dāng)你使用像這樣的操作提供器時,你不必處理有關(guān)這個菜單項的用戶事件。

要給一個操作項聲明一個操作提供器,就要在菜單資源中對應(yīng)的<item>元素中定義android:actionProviderClass屬性,提供器要使用完整的類名。例如:

  1. <?xml version="1.0" encoding="utf-8"?>  
    <menu xmlns:android="http://schemas.android.com/apk/res/android">  
        <item android:id="@+id/menu_share"  
              android:title="@string/share"  
              android:showAsAction="ifRoom"  
              android:actionProviderClass="android.widget.ShareActionProvider" />  
        ...  
    </menu>

在這個例子中,用ShareActionProvider類作為操作提供器,在這里,操作提供器需要菜單項的控制,并處理它們在操作欄中的外觀和行為以及在溢出菜單中的行為。你必須依然給這個菜單項提供一個用于溢出菜單的文本標(biāo)題。

盡管操作提供器提供了它在溢出菜單中顯示時所能執(zhí)行的默認(rèn)操作,但是Activity(或Fragment)也能夠通過處理來自onOptionsItemSelected()回調(diào)方法的點擊事件來重寫這個默認(rèn)操作。如果你不在這個回調(diào)方法中處理點擊事件,那么操作提供器會接收onPerformDefaultAction()回調(diào)來處理事件。但是,如果操作提供器提供了一個子菜單,那么Activity將不會接收onOptionsItemSelected()回調(diào),因為子菜單的顯示替代了選擇時調(diào)用的默認(rèn)菜單行為。

使用ShareActionProvider類

       如果你想要在操作欄中提供一個“共享”操作,以充分利用安裝在設(shè)備上的其他應(yīng)用程序(如,把一張圖片共享給消息或社交應(yīng)用程序使用),那么使用ShareActionProvider類是一個有效的方法,而不是添加一個調(diào)用ACTION_SEND類型Intent對象的操作項。當(dāng)你給一個操作項使用ShareActionProvider類時,它會呈現(xiàn)一個帶有能夠處理ACTION_SEND類型Intent對象的應(yīng)用程序的下拉列表(如圖8所示)。

                Android UI開發(fā)第二十四篇——Action Bar

        圖8. Gallery 應(yīng)用截屏,用ShareActionProvider對象展開顯示共享目標(biāo)。

        創(chuàng)建子菜單的所有邏輯,包括共享目標(biāo)的封裝、點擊事件的處理(包在溢出菜單中的項目顯示)等,都在ShareActionProvider類中實現(xiàn)了---你需要編寫的唯一的代碼是給對應(yīng)的菜單項聲明操作提供器,并指定共享的Intent對象。

        默認(rèn)情況,ShareActionProvider對象會基于用戶的使用頻率來保留共享目標(biāo)的排列順序。使用頻率高的目標(biāo)應(yīng)用程序會顯示在下來列表的上面,并且最常用的目標(biāo)會作為默認(rèn)共享目標(biāo)直接顯示在操作欄。默認(rèn)情況下,排序信息被保存在由DEFAULT_SHARE_HISTORY_FILE_NAME指定名稱的私有文件中。如果你只使用一種操作類型ShareActionProvider類或它的一個子類,那么你應(yīng)該繼續(xù)使用這個默認(rèn)的歷史文件,而不需要做任何事情。但是,如果你使用了不同類型的多個操作的ShareActionProvider類或它的一個子類,那么為了保持它們自己的歷史,每種ShareActionProvider類都應(yīng)該指定它們自己的歷史文件。給每種ShareActionProvider類指定不同的歷史文件,就要調(diào)用setShareHistoryFileName()方法,并且提供一個XML文件的名字(如,custom_share_history.xml)

        注意:盡管ShareActionProvider類是基于使用頻率來排列共享目標(biāo)的,但是這種行為是可擴展的,并且ShareActionProvider類的擴展能夠基于歷史文件執(zhí)行不同的行為和排序。

        要添加ShareActionProvider對象,只需簡單的給android.actionProviderClass屬性設(shè)定android.widget.ShareActionProvider屬性值就可以了。唯一要做的事情是定義你要用于共享的Intent對象,你必須先調(diào)用getActionProvider()方法來獲取跟菜單項匹配的ShareActionProvider對象,然后調(diào)用setShareIntent()方法。

      如果對于共享的Intent對象的格式依賴與被選擇的菜單項,或其他的在Activity生存周期內(nèi)改變的變量,那么你應(yīng)該把ShareActionProvider對象保存在一個成員屬性里,并在需要的時候調(diào)用setShareIntent()方法來更新它。如:

  1. private ShareActionProvider mShareActionProvider;  
    ...  
      
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();  
      
        // If you use more than one ShareActionProvider, each for a different action,  
        // use the following line to specify a unique history file for each one.  
        // mShareActionProvider.setShareHistoryFileName("custom_share_history.xml");  
      
        // Set the default share intent  
        mShareActionProvider.setShareIntent(getDefaultShareIntent());  
      
        return true;  
    }  
    // When you need to update the share intent somewhere else in the app, call  
    // mShareActionProvider.setShareIntent()

 上例中ShareActionProvider對象處理所有的跟這個菜單項有關(guān)的用戶交互,并且不需要處理來自onOptionsItemSelected()回調(diào)方法的點擊事件。

創(chuàng)建一個自定義的操作提供器

       當(dāng)你想要創(chuàng)建一個有動態(tài)行為和在懸浮菜單中有默認(rèn)圖標(biāo)的操作視窗時,繼承ActionProvider類來定義這些行為是一個比好的的方案。創(chuàng)建自己的操作提供器,提供一個有組織的可重用的組件,而不是在Fragment或Activity的代碼中處理各種操作項的變換和行為。

       要創(chuàng)建自己的操作提供器,只需簡單的繼承ActionProvider類,并且實現(xiàn)合適的回調(diào)方法。你應(yīng)該實現(xiàn)以下重要的回調(diào)方法:

ActionProvider()

        這個構(gòu)造器把應(yīng)用程序的Context對象傳遞個操作提供器,你應(yīng)該把它保存在一個成員變量中,以便其他的回調(diào)方法使用。

OnCreateActionView()

        這是你給菜單項定義操作視窗的地方。使用從構(gòu)造器中接收的Context對象,獲取一個LayoutInflater對象的實例,并且用XML資源來填充操作視窗,然后注冊事件監(jiān)聽器。如:

  1. public View onCreateActionView() {  
        // Inflate the action view to be shown on the action bar.  
        LayoutInflater layoutInflater = LayoutInflater.from(mContext);  
        View view = layoutInflater.inflate(R.layout.action_provider, null);  
        ImageButton button = (ImageButton) view.findViewById(R.id.button);  
        button.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                // Do something...  
            }  
        });  
        return view;  
    }

onPerformDefaultAction()
         在選中懸浮菜單中的菜單時,系統(tǒng)會調(diào)用這個方法,并且操作提供器應(yīng)該這對這個選中的菜單項執(zhí)行默認(rèn)的操作。

       但是,如果你的操作提供器提供了一個子菜單,即使是懸浮菜單中一個菜單項的子菜單,那么也要通過onPrepareSubMenu()回調(diào)方法來顯示子菜單。這樣onPerformDefaultAction()在子菜單顯示時就不會被調(diào)用。

       注意:實現(xiàn)了onOptionsItemSelected()回調(diào)方法的Activity或Frament對象能夠通過處理item-selected事件(并且返回true)來覆蓋操作提供器的默認(rèn)行為,這種情況下,系統(tǒng)不會調(diào)用onPerformDefaultAction()回調(diào)方法。

添加導(dǎo)航選項標(biāo)簽

       當(dāng)你想要在一個Activity中提供導(dǎo)航選擇標(biāo)簽時,使用操作欄的選項標(biāo)簽是一個非常好的選擇(而不是使用TabWidget類),因為系統(tǒng)會調(diào)整操作欄選項標(biāo)簽來適應(yīng)不同尺寸的屏幕的需要---在屏幕足夠?qū)挼臅r候,導(dǎo)航選項標(biāo)簽會被放到主操作欄中;當(dāng)屏幕太窄的時候,選項標(biāo)簽會被放到一個分離的橫條中,如圖9和圖10所示。

      Android UI開發(fā)第二十四篇——Action Bar

圖9. Honeycomb Gallery應(yīng)用程序中的操作欄選項標(biāo)簽的截圖

      Android UI開發(fā)第二十四篇——Action Bar

          圖10. 在窄屏設(shè)備上被堆放在操作欄中的選項標(biāo)簽的截屏 

       要使用選項標(biāo)簽在Fragmengt之間切換,你必須在每次選擇一個選項標(biāo)簽時執(zhí)行一個Fragment事務(wù)。如果你不熟悉如何使用FragmentTransaction對象來改變Fragment,請閱讀Fragment開發(fā)指南。

       首先,你的布局必須包含一個用于放置跟每個Fragment對象關(guān)聯(lián)的選項標(biāo)簽的ViewGroup對象。并且要確保這個ViewGroup對象有一個資源ID,以便你能夠在選項標(biāo)簽的切換代碼中能夠引用它。另外,如果選項標(biāo)簽的內(nèi)容填充在Activity的布局中(不包括操作欄),那么Activity不需要任何布局(你甚至不需要調(diào)用setContentView()方法)。相反,你能夠把每個Fragment對象放到默認(rèn)的根ViewGroup對象中,你能夠用android.R.id.content ID來引用這個ViewGroup對象(在Fragment執(zhí)行事務(wù)期間,你能夠在下面的示例代碼中看到如何使用這個ID的。

        決定了Fragment對象在布局中的顯示位置后,添加選項標(biāo)簽的基本過程如下:

          1.  實現(xiàn)ActionBar.TabListener接口。這個接口中回調(diào)方法會響應(yīng)選項標(biāo)簽上的用戶事件,以便你能夠切換Fragment對象;

           2.  對于每個要添加的選項標(biāo)簽,都要實例化一個ActionBar.Tab對象,并且調(diào)用setTabListener()方法設(shè)置ActionBar.Tab對象的事件監(jiān)聽器。還可以用setText()或setIcon()方法來設(shè)置選項標(biāo)簽的標(biāo)題或圖標(biāo)。

         3.  通過調(diào)用addTab()方法,把每個選項標(biāo)簽添加到操作欄。

        在查看ActionBar.TabListener接口時,注意到回調(diào)方法只提供了被選擇的ActionBar.Tab對象和執(zhí)行Fragment對象事務(wù)的FragmentTransaction對象---沒有說明任何有關(guān)Fragment切換的事。因此。你必須定義自己的每個ActionBar.Tab之間的關(guān)聯(lián),以及ActionBar.Tab所代表的適合的Fragment對象(為了執(zhí)行合適的Fragment事務(wù))。依賴你的設(shè)計,會有幾種不同的方法來定義這種關(guān)聯(lián)。在下面的例子中,ActionBar.TabListener接口的實現(xiàn)提供了一個構(gòu)造器,這樣每個新的選項標(biāo)簽都會使用它自己的監(jiān)聽器實例。每個監(jiān)聽器實例都定義了幾個在對應(yīng)Fragment對象上執(zhí)行事務(wù)時必須的幾個成員變量。

       例如,以下示例是ActionBar.TabListener接口的一種實現(xiàn),在這個實現(xiàn)中,每個選項標(biāo)簽都使用了它自己的監(jiān)聽器實例:

public static class TabListener<T extends Fragment> implements ActionBar.TabListener {  
    private Fragment mFragment;  
    private final Activity mActivity;  
    private final String mTag;  
    private final Class<T> mClass;  
  
    /** Constructor used each time a new tab is created. 
      * @param activity  The host Activity, used to instantiate the fragment 
      * @param tag  The identifier tag for the fragment 
      * @param clz  The fragment's Class, used to instantiate the fragment 
      */  
    public TabListener(Activity activity, String tag, Class<T> clz) {  
        mActivity = activity;  
        mTag = tag;  
        mClass = clz;  
    }  
  
    /* The following are each of the ActionBar.TabListener callbacks */  
  
    public void onTabSelected(Tab tab, FragmentTransaction ft) {  
        // Check if the fragment is already initialized  
        if (mFragment == null) {  
            // If not, instantiate and add it to the activity  
            mFragment = Fragment.instantiate(mActivity, mClass.getName());  
            ft.add(android.R.id.content, mFragment, mTag);  
        } else {  
            // If it exists, simply attach it in order to show it  
            ft.attach(mFragment);  
        }  
    }  
  
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {  
        if (mFragment != null) {  
            // Detach the fragment, because another one is being attached  
            ft.detach(mFragment);  
        }  
    }  
  
    public void onTabReselected(Tab tab, FragmentTransaction ft) {  
        // User selected the already selected tab. Usually do nothing.  
    }  
}

警告:針對每個回調(diào)中的Fragment事務(wù),你都不必調(diào)用commit()方法---系統(tǒng)會調(diào)用這個方法,并且如果你自己調(diào)用了這個方法,有可能會拋出一個異常。你也不能把這些Fragment事務(wù)添加到回退堆棧中。

在這個例子中,當(dāng)對應(yīng)的選項標(biāo)簽被選擇時,監(jiān)聽器只是簡單的把一個Fragment對象附加(attach()方法)到Activity布局上---或者,如果沒有實例化,就會創(chuàng)建這個Fragment對象,并且把它添加(add()方法)到布局中(android.R.id.content ViewGroup的一個子類),當(dāng)這個選項標(biāo)簽解除選擇時,對應(yīng)的Fragment對象也會被解除與布局的依附關(guān)系。

       ActionBar.TabListener的實現(xiàn)做了大量的工作,剩下的事情就是創(chuàng)建每個ActionBar.Tab對象并把它添加到ActionBar對象中,另外,你必須調(diào)用setNavigationMode(NAVIGATION_MODE_TABS)方法來讓選項標(biāo)簽可見。如果選項標(biāo)簽的標(biāo)題實際指示了當(dāng)前的View對象,你也可以通過調(diào)用setDisplayShowTitleEnabled(false)方法來禁用Activity的標(biāo)題。

       例如,下面的代碼使用上面定義的監(jiān)聽器在操作欄中添加了兩個選項標(biāo)簽。

    1. @Override  
      protected void onCreate(Bundle savedInstanceState) {  
          super.onCreate(savedInstanceState);  
          // Notice that setContentView() is not used, because we use the root  
          // android.R.id.content as the container for each fragment  
        
          // setup action bar for tabs  
          ActionBar actionBar = getActionBar();  
          actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
          actionBar.setDisplayShowTitleEnabled(false);  
        
          Tab tab = actionBar.newTab()  
                  .setText(R.string.artist)  
                  .setTabListener(new TabListener<ArtistFragment>(  
                          this, "artist", ArtistFragment.class));  
          actionBar.addTab(tab);  
        
          tab = actionBar.newTab()  
              .setText(R.string.album)  
              .setTabListener(new TabListener<AlbumFragment>(  
                      this, "album", AlbumFragment.class));  
          actionBar.addTab(tab);  
      }

    注意:以上有關(guān)ActionBar.TabListener的實現(xiàn),只是幾種可能的技術(shù)之一。在API Demos應(yīng)用中你能夠看到更多的這種樣式。

        如果Activity終止了,那么你應(yīng)該保存當(dāng)前選擇的選項標(biāo)簽的狀態(tài),以便當(dāng)用戶再次返回時,你能夠打開合適的選項標(biāo)簽。在保存狀態(tài)的時刻,你能夠用getSelectedNavigationIndex()方法查詢當(dāng)前的被選擇的選項標(biāo)簽。這個方法返回被選擇的選項標(biāo)簽的索引位置。

       警告:保存每個Fragment所必須的狀態(tài)是至關(guān)重要的,因為當(dāng)用戶用選項標(biāo)簽在Fragment對象間切換時,它會查看Fragment在離開時樣子。

       注意:在某些情況下,Android系統(tǒng)會把操作欄選項標(biāo)簽作為一個下拉列表來顯示,以便確保操作欄的最優(yōu)化顯示。

添加下拉式導(dǎo)航

       作為Activity內(nèi)部的另一種導(dǎo)航(或過濾)模式,操作欄提供了內(nèi)置的下拉列表。下拉列表能夠提供Activity中內(nèi)容的不同排序模式。

       啟用下拉式導(dǎo)航的基本過程如下:

         1.  創(chuàng)建一個給下拉提供可選項目的列表,以及描畫列表項目時所使用的布局;

         2.  實現(xiàn)ActionBar.OnNavigationListener回調(diào),在這個回調(diào)中定義當(dāng)用戶選擇列表中一個項目時所發(fā)生的行為;

         3.  用setNavigationMode()方法該操作欄啟用導(dǎo)航模式,如:

  1. ActionBar actionBar = getActionBar();  
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

 4.  用setListNavigationCallbacks()方法給下拉列表設(shè)置回調(diào)方法,如:

  1. actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback);

這個方法需要SpinnerAdapter和ActionBar.OnNavigationListener對象。下面是 SpinnerAdapter and ActionBar.OnNavigationListener 的例子。

 Example SpinnerAdapter and OnNavigationListener

設(shè)置操作欄的樣式

       如果你對應(yīng)用程序中的可視構(gòu)件進行了定制化的設(shè)計,那么你可能也會要對操作欄做一些重新設(shè)計,以便跟應(yīng)用程序的設(shè)計匹配。要這樣做的話,需要使用Android的樣式與主題框架中的一些特殊的樣式屬性來重新設(shè)置操作欄的樣式。

       注意:改變外觀的背景圖片依賴與當(dāng)前按鈕的狀態(tài)(選擇、按下、解除選擇),因此你使用的可描畫的資源必須是一個可描畫的狀態(tài)列表。

       警告:對于你提供的所有可描畫的背景,要確保使用NinePatch類型可描畫資源,以便允許圖片的拉伸。NinePatch類型的圖片應(yīng)該比40像素高30像素寬的圖片要小。


普通的外觀

android:windowActionBarOverlay

      這個屬性聲明了操作欄是否應(yīng)該覆蓋Activity布局,而不是相對Activity的布局位置的偏移。這個屬性的默認(rèn)值是false。

      通常,在屏幕上,操作欄需要它自己的空間,并且把剩下的空間用來填充Activity的布局。當(dāng)操作欄四覆蓋模式時,Activity會使用所有的有效空間,系統(tǒng)會在Activity的上面描畫操作欄。如果你想要在操作欄隱藏和顯示時,布局中的內(nèi)容保持固定的尺寸好位置,那么這種覆蓋模式是有用的。你也可能只是為了顯示效果來使用它,因為你可以給操作欄設(shè)置半透明的背景,以便用戶依然能夠看到操作欄背后的Activity布局。

       注意:默認(rèn)情況下,Holo主題會用半透明背景來描畫操作欄。但是,你能夠用自己的樣式來修改它,并且默認(rèn)的情況下,DeviceDefault主題在不同的設(shè)備上可能使用不透明的背景。

       覆蓋模式被啟用時,Activity布局不會感知到操作欄覆蓋在它的上面,因此,在操作欄覆蓋的區(qū)域,最好不要放置一些重要的信息或UI組件。如果適合,你能夠引用平臺的actionBarSize值來決定操作欄的高度,例如,在XML布局文件中引用這個值。

  1. <SomeView  
        ...  
        android:layout_marginTop="?android:attr/actionBarSize" />

你還能夠用getHeight()方法在運行時獲取操作欄的高度。如果在Activity生存周期的早期調(diào)用這個方法,那么在調(diào)用時所反映的操作欄的高度可能不包括被堆放的操作欄(因為導(dǎo)航選項標(biāo)簽)。要看如何在運行時判斷操作欄總的高度(包括被堆放的操作欄),請看Honeycomb Gallery示例應(yīng)用中的TitlesFragment類。

操作項元素

  • android:actionButtonStyle

  • 給操作項按鈕定義樣式資源。

  • android:actionBarItemBackground

  •  給每個操作項的背景定義可描畫資源(被添加在API 級別 14中)。

  • android:itemBackground

  •  給每個懸浮菜單項的背景定義可描畫資源。

  • android:actionBarDivider

  • 給操作項之間的分隔線定義可描畫資源(被添加在API 級別 14中)

  • android:actionMenuTextColor

  • 給顯示在操作項中文本定義顏色。

  • android:actionMenuTextAppearance

  •  給顯示在操作項中文本定義樣式資源。

  • android:actionBarWidgetTheme

  • 給作為操作視窗被填充到操作欄中的可視構(gòu)件定義主題資源(被添加在API級別14中)。

導(dǎo)航選項標(biāo)簽

android:actionBarTabStyle 給操作欄中的選項標(biāo)簽定義樣式資源。android:actionBarTabBarStyle給顯示在導(dǎo)航選項標(biāo)簽下方的細(xì)條定義樣式資源。android:actionBarTabTextStyle給導(dǎo)航選項標(biāo)簽中的文本定義樣式資源。下拉列表

android:actionDropDownStyle 給下拉導(dǎo)航列表定義樣式(如背景和文本樣式)。如,下例XML文件中給操作欄定義了一些定制的樣式:
  1. <?xml version="1.0" encoding="utf-8"?>  
    <resources>  
        <!-- the theme applied to the application or activity -->  
        <style name="CustomActivityTheme" parent="@android:style/Theme.Holo">  
            <item name="android:actionBarTabTextStyle">@style/CustomTabTextStyle</item>  
            <item name="android:actionBarDivider">@drawable/ab_divider</item>  
            <item name="android:actionBarItemBackground">@drawable/ab_item_background</item>  
        </style>  
      
        <!-- style for the action bar tab text -->  
        <style name="CustomTabTextStyle" parent="@android:style/TextAppearance.Holo">  
            <item name="android:textColor">#2456c2</item>  
        </style>  
    </resources>

 注意:一定要在<style>標(biāo)

名稱欄目:AndroidUI開發(fā)第二十四篇——ActionBar
URL鏈接:http://muchs.cn/article28/pgoicp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT自適應(yīng)網(wǎng)站、營銷型網(wǎng)站建設(shè)、小程序開發(fā)、品牌網(wǎng)站設(shè)計、虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營