編輯: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就可以了。
單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。 針對Android開發,目前網上有很多在Eclipse環境下進行單元測試的教程,然而
阿裡客戶端工程師試題簡析——Android應用的閃退(crash)分析1. 問題描述 閃退(Crash)是客戶端程序在運行時遭遇無法處理的異常或
最終效果展示: 項目介紹:通過碎片的方式顯示標題列表和內容,其中也牽涉到橫豎屏的知識 項目代碼下載:http://files.cnblogs.com/
下面我從安卓開發的角度,簡單寫一下如何獲取手機設備信息和手機號碼 准備條件:一部安卓手機、手機SIM卡確保插入手機裡、eclipse ADT和android-s