Android官方開發文件Training系列課程中文版:新增ActionBar之新增Action按鈕
新增Action按鈕
ActionBar允許在當前的APP上下文內新增很多重要的功能按鈕。這樣便可以通過圖示或者文字作為功能按鈕直接展示在ActionBar上。功能按鈕如果沒有足夠空間或無足輕重的按鈕都會隱藏在隱藏按鈕下。
在XML指定功能
所有的功能按鈕包括其它在隱藏按鈕下的功能按鈕都可以通過XML選單資源來定義。為了新增功能到ActionBar,需要在res/menu/目錄下建立一個新的xml檔案。
為每一個需要新增到ActionBar的按鈕新增一個< item>標籤:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Search, should appear as action button -->
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
android:showAsAction="ifRoom" />
<!-- Settings, should always be in the overflow -->
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:showAsAction="never" />
</menu>
這裡聲明瞭當ActionBar有可用空間的時候Search功能應該作為一個按鈕放在ActionBar上。但是設定按鈕會總是出現在下拉列表中(預設情況下,所有的功能都會出現在下拉列表中,這對於每一個功能顯示的宣告你的設計意圖是最好的鍛鍊)。
icon屬性這裡要求一個圖片的資源ID,這裡跟的是@drawable/name,這裡的name必須是儲存在工程中res/drawable/目錄下儲存的點陣圖影象名稱。比如”@drawable/ic_action_search”就是引用了一個名為ic_action_search.png的圖片資源。很相似的,title屬性也是使用了一個在XML檔案中定義的字串資源。
Note:當為應用建立圖示或者其它的點陣圖影象時,drawable資料夾對於提供不同版本的螢幕密度資源來說是很重要的一點。
如果為了相容像Android 2.1這種低版本而使用了支援庫,showAsAction屬性對於名稱空間android:是不可用的。如果要使用支援庫的話必須要在XML中定義自定義的XML名稱空間識別符號,然後再使用這個名稱空間的識別符號(自定義的XML名稱空間應該基於應用的名稱,如果只是在這個檔案下操作的話,可以命名為你想命名的任何名稱):
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
<!-- Search, should appear as action button -->
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
yourapp:showAsAction="ifRoom" />
...
</menu>
新增功能按鈕到ActionBar上
為了將選單按鈕直接放置到ActionBar上,需要重寫實現activity中的onCreateOptionsMenu()方法,然後載入選單資源到回撥方法的引數menu物件中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity_actions, menu);
return super.onCreateOptionsMenu(menu);
}
響應功能按鈕
當用戶點選了其中一個功能按鈕或者其它下拉列表中按鈕之後,然後系統會呼叫activity中的
onOptionsItemSelected()方法。在實現的這個方法中,呼叫回撥引數MenuItem的getItemId()方法返回的值與ID進行匹配,去決定是哪個功能按鈕按下的。這裡的ID便是在XML中宣告的< item>標籤中的android:id屬性中定義的。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.action_search:
openSearch();
return true;
case R.id.action_settings:
openSettings();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
為低等級的Activity新增返回按鈕
Note:Gmail的返回按鈕
應用中的所有Activity不都是應用的主入口,所以應該在ActionBar上提供一個返回按鈕,以便讓使用者可以通過點選返回按鈕返回到上一個螢幕頁面。
當執行在Android 4.1或者更高版本上,又或者是使用了ActionBarActivity的支援庫的應用,可以在清單檔案中簡單的申明ActionBar的返回按鈕所要返回的介面:
<application ... >
...
<!-- The main/home activity (it has no parent activity) -->
<activity
android:name="com.example.myfirstapp.MainActivity" ...>
...
</activity>
<!-- A child of the main activity -->
<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
</application>
然後通過setDisplayHomeAsUpEnabled()設定返回按鈕為可用狀態:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_displaymessage);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// If your minSdkVersion is 11 or higher, instead use:
// getActionBar().setDisplayHomeAsUpEnabled(true);
}
因為現在系統知道了DisplayMessageActivity的父介面為MainActivity,當用戶按下了返回按鈕,然後系統會適當的導航介面到MainActivity,所以你不需要自己處理返回按鈕的點選事件。