Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android編程入門 >> Android學習筆記:ActionBar使用介紹

Android學習筆記:ActionBar使用介紹

編輯:Android編程入門

一、基本概念

最權威和官方的介紹請看google的api文檔

http://developer.android.com/training/basics/actionbar/setting-up.html

 http://developer.android.com/guide/topics/ui/actionbar.html

ActionBar故名思意,操作欄的含義,一般位於activity的頂部,可以放置文本標簽,搜索框、按鈕、圖標等。是 Android3才支持的。

在eclipse創建一個默認的activity,啟動後如下圖所示,默認顯示了app的圖標和app的name,注意選擇不同的版本可能有略微區別。

我們再看下google api文檔上給的例子圖

上面圖中,①是app的圖標;②是兩個操作按鈕,一個是搜索按鈕;③是overflow按鈕(overflow的含義 後面再介紹)。

二、設置不顯示ActionBar

如果想要Activity不顯示ActionBar,可以有兩種方法:

1)在 AndroidManifest.xml中指定Application或Activity的theme如:

android:theme="@android:style/Theme.Light.NoTitleBar"

2)在activity的onCreate事件中通過代碼設置,如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ActionBar actionBar = getActionBar();
    actionBar.hide();
}

 這樣,activity就不會顯示ActionBar了。

三、更改默認圖標和標題

默認情況下,activity會使用AndroidManifest.xml中application的icon屬性指定的圖片來作為ActionBar的圖標,如:

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"

但是我們也可以改變這一默認行為,如果我們想要使用另外一張圖片來作為ActionBar的圖標,可以設置activity的logo屬性來進行指定。

比如項目的res/drawable目錄下有一張mylogo.png圖片,就可以在AndroidManifest.xml中這樣指定:

<activity
android:logo="@drawable/mylogo"

標題可以通過設置配置文件中的 android:label 屬性來設置,也可以通過代碼來設置,如:

    @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		setTitle("我的應用");
	}

四、添加操作按鈕

ActionBar還可以根據應用程序當前的功能來提供與其相關的Action按鈕,這些按鈕都會以圖標或文字的形式直接顯示在ActionBar上。如果按鈕過多,ActionBar上顯示不完,多出的一些按鈕可以隱藏在overflow裡面(最右邊的三個點就是overflow按鈕,前面提到了),點擊一下overflow按鈕就可以看到全部的Action按鈕了。 當Activity啟動的時候,系統會調用Activity的onCreateOptionsMenu()方法來取出所有的Action按鈕,我們只需要在這個方法中去加載一個menu資源,並把所有的Action按鈕都定義在資源文件裡面就可以了。

1、首先在 res\menu目錄下增加配置文件,如 main.xml (用eclipse創建時會默認創建該文件)

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.testactionbar.MainActivity" >

    <item  
        android:id="@+id/action1"  
        android:icon="@drawable/a1"  
        android:showAsAction="always"  
        android:title="action1"/>  
    <item  
        android:id="@+id/action2"  
        android:icon="@drawable/a2"  
        android:showAsAction="ifRoom"  
        android:title="action2"/>  
    
    <item  
        android:id="@+id/action3"  
        android:icon="@drawable/a3"  
        android:showAsAction="never"  
        android:title="action3"/>
    
</menu>

  上面的文件中,通過item標簽增加了3個操作按鈕。<item>標簽中又有一些屬性,其中id是該Action按鈕的唯一標識符,icon用於指定該按鈕的圖標,title用於指定該按鈕可能顯示的文字(在設置了圖標的情況下,ActionBar上不會顯示文字),showAsAction則指定了該按鈕顯示的位置,主要有以下幾種值可選:always表示永遠顯示在ActionBar中,如果屏幕空間不夠則無法顯示;ifRoom表示屏幕空間夠的情況下顯示在ActionBar中,不夠的話就顯示在overflow中;never則表示永遠顯示在overflow中(這是缺省情況)。

 2、接著,重寫Activity的onCreateOptionsMenu()方法,代碼如下所示:

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

  如果是用eclipse創建的工程,這段代碼缺省會提供。

五、添加操作按鈕的響應事件

當點擊操作按鈕時,可以觸發事件,在事件代碼中可以做出自己的處理,如顯示新界面。當用戶點擊Action按鈕的時候,系統會調用Activity的onOptionsItemSelected()方法,通過方法傳入的MenuItem參數,我們可以調用它的getItemId()方法和menu資源中的id進行比較,從而辨別出用戶點擊的是哪一個Action按鈕,然後做出相應的操作,如:

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch(item.getItemId()){
		case R.id.action1:
			Toast.makeText(this, "i am"+item.getTitle(), Toast.LENGTH_SHORT).show();
			return true;
		case R.id.action2:
			Toast.makeText(this, "i am"+item.getTitle(), Toast.LENGTH_SHORT).show();
			return true;
		case R.id.action3:
			Toast.makeText(this, "i am"+item.getTitle(), Toast.LENGTH_SHORT).show();
			return true;
		default:
			return super.onOptionsItemSelected(item);
		}
	}

 

六、Overflow按鈕不顯示的情況

雖然現在我們已經掌握了不少ActionBar的用法,但是當你真正去使用它的時候還是可能會遇到各種各樣的問題,比如很多人都會碰到overflow按鈕不顯示的情況。明明是同樣的一份代碼,overflow按鈕在有些手機上會顯示,而在有些手機上偏偏就不顯示,這是為什麼呢?後來我總結了一下,overflow按鈕的顯示情況和手機的硬件情況是有關系的,如果手機沒有物理Menu鍵的話,overflow按鈕就可以顯示;如果有物理Menu鍵的話,overflow按鈕就不會顯示出來,這時只有按下物理按鈕後才顯示隱藏在overflow中的按鈕。 但可能很多用戶不知道這點。

這顯然是一種非常蛋疼的設計,在不同手機上竟然顯示了不同的界面,而且操作方法也完全不一樣,這樣會給用戶一種非常不習慣的感覺。話說Google為什麼要把ActionBar的overflow設計成這樣我也不太理解,但是我們還是有辦法改變這一默認行為的。 實際上,在ViewConfiguration這個類中有一個叫做sHasPermanentMenuKey的靜態變量,系統就是根據這個變量的值來判斷手機有沒有物理Menu鍵的。當然這是一個內部變量,我們無法直接訪問它,但是可以通過反射的方式修改它的值,讓它永遠為false就可以了,代碼如下所示:
@Override  
protected void onCreate(Bundle savedInstanceState) {  
    ......  
    setOverflowShowingAlways();  
}  
  
private void setOverflowShowingAlways() {  
    try {  
        ViewConfiguration config = ViewConfiguration.get(this);  
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");  
        menuKeyField.setAccessible(true);  
        menuKeyField.setBoolean(config, false);  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
}  

這樣只要有顯示不全的按鈕,overflow按鈕就會一直顯示了。

七、讓Overflow中的選項顯示圖標

如果你點擊一下overflow按鈕去查看隱藏的Action按鈕,你會發現這部分Action按鈕都是只顯示文字不顯示圖標的。

這是官方的默認效果,Google認為隱藏在overflow中的Action按鈕都應該只顯示文字。當然,如果你認為這樣不夠美觀,希望在overflow中的Action按鈕也可以顯示圖標,我們仍然可以想辦法來改變這一默認行為。 其實,overflow中的Action按鈕應不應該顯示圖標,是由MenuBuilder這個類的setOptionalIconsVisible方法來決定的,如果我們在overflow被展開的時候給這個方法傳入true,那麼裡面的每一個Action按鈕對應的圖標就都會顯示出來了。調用的方法當然仍然是用反射了,代碼如下所示:
@Override  
public boolean onMenuOpened(int featureId, Menu menu) {  
    if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {  
        if (menu.getClass().getSimpleName().equals("MenuBuilder")) {  
            try {  
                Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);  
                m.setAccessible(true);  
                m.invoke(menu, true);  
            } catch (Exception e) {  
            }  
        }  
    }  
    return super.onMenuOpened(featureId, menu);  
}  

 可以看到,這裡我們重寫了一個onMenuOpened()方法,當overflow被展開的時候就會回調這個方法,接著在這個方法的內部通過返回反射的方法將MenuBuilder的setOptionalIconsVisible變量設置為true就可以了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved