Android活動條(actionbar)使用詳解(一)
阿新 • • 發佈:2019-01-25
活動條(ActionBar)是Android3.0的重要更新之一,ActionBar位於傳統標題的位置,其主要提供瞭如下功能:
>顯示選項選單的選單項,即激昂選單項顯示在Action Item;
>使用程式圖示作為返回Home主屏或向上的導航操作;
>提供互動式View作為Action View;
>提供基於Tab的導航方式,可用於切換多個Fragment
>提供基於下拉的導航方式
1.啟用/關閉ActionBar
Android3.0及以上版本已經預設啟用了ActionBar,只需要在AndroidManifest.xml檔案的SDK配置指定Android版本高於11就會預設啟用ActionBar,程式碼如下:
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="17" />
在實際專案中,通常推薦使用程式碼來控制ActionBar的顯示、隱藏,程式碼實現如下:
ActionBar actionBar = getActionBar(); //返回ActionBar例項
actionBar.show(); //顯示
actionBar.hide(); //隱藏
當然,只有當應用主題沒有關閉ActionBar時才能返回ActionBar例項。如果設定應用主題或Activity的主題屬性Android:name="@android:style/Theme.Holo.NoActionBar",則關閉ActionBar活動條功能。
注意:在使用ActionBar過程中,明明我們將Android的SDK版本設定大於3.0,但是仍不能實現在標題欄顯示ActionBar或者getActionBar()返回的null。這是由於Android應用的主題的錯誤,有兩種方法:
(1)在新建專案時,設定Android版本高於3.0
(2)刪除AndroidManifest.xml清單檔案<Application.../>元素中的Android:theme屬性,然後在Activity程式碼中新增getWindow().requestFeature(Window.FEATURE_ACTION_BAR);即可 。
2.使用ActionBar顯示選項選單
由於有些手機不存在MENU按鍵,Android提供了ActionBar將選項選單顯示成Action Item。從Android 3.0開始,MenuItem新增如下方法用於將選單選項顯示在ActionBar上作為ActionItem。ActionBar還可以根據應用程式當前的功能來提供與其相關的Action按鈕,這些按鈕都會以圖示或文字的形式直接顯示在ActionBar上。當然,如果按鈕過多,ActionBar上顯示不完,多出的一些按鈕可以隱藏在overflow裡面(最右邊的三個點就是overflow按鈕),點選一下overflow按鈕就可以看到全部的Action按鈕了。 當Activity啟動的時候,系統會呼叫Activity的onCreateOptionsMenu()方法來取出所有的Action按鈕,我們只需要在這個方法中去載入一個menu資源(menu/*.xml),並把所有的Action按鈕都定義在資原始檔裡面就可以了。
setShowAsAction(int actionEnum)
該方法設定是否將該選單顯示在ActionBar上,作為ActionItem。其中,actionEnum方法支援如下引數值:
>SHOW_AS_ACTION_ALWAYS:總是將該MenuItem顯示在ActionBar上;
>SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW:將該Action View摺疊成普通選單項
>SHOW_AS_ACTION_IF_ROOM:當ActionBar位置足夠時才顯示MenuItem
>SHOW_AS_ACTION_NEVER:不將該MenuItem顯示在ActionBar上
>SHOW_AS_ACTION_WITH_TEXT:將該MenuItem顯示在ActionBar上,並顯示選單項的文字
然後,在實際專案中我們推薦使用XML資原始檔來定義選單,因為,我們可以直接在選單資原始檔中的<item.../>元素指定如下屬性即可:
<item android:title="選單項名稱"
android:icon="選單項標題"
android:showAsAction="always|withText"
//總是將選單項顯示在ActionBar上並顯示選單項的文字
......./>
原始碼舉例:
(1)選單資原始檔/res/menu/menu.xml
3.啟用程式圖示導航
為了實現將應用程式圖示轉變成可以點選的圖示,可以呼叫ActionBar的以下方法: >setDisplayHomeAsUpEnabled(boolean showHomeAsUp):設定是否將應用程式圖示轉變成可點選的圖示,並在圖示上新增一個向左的箭頭; >setDisplayOptions(int options):通過傳入int型別變數來控制該ActionBar的顯示選項; >setDisplayShowHomeEnabled(boolean showHome):設定是否顯示應用程式的圖示; >setHomeButtonEnabled(boolean enabled):設定是否將應用程式圖示轉換變成可點選的按鈕; 原始碼實戰: 功能:將該Activity的程式圖示轉變成可點選的圖示,並控制用於單擊該圖示時返回程式的主Activity.
(2)刪除AndroidManifest.xml清單檔案<Application.../>元素中的Android:theme屬性,然後在Activity程式碼中新增getWindow().requestFeature(Window.FEATURE_ACTION_BAR);即可
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- 第一個選單項:字型大小選單,並設定為ActionBar(假如手機無Menu鍵)-->
- <item android:title="@string/font_size"
- android:icon="@drawable/font"
- android:showAsAction="always|withText">
- <menu>
- <!-- 定義一組單選選單項 ,然後定義一組選單選項-->
- <group android:checkableBehavior="single">
- <item
- android:id="@+id/font_10"
- android:title="@string/font_10"/>
- <item
- android:id="@+id/font_12"
- android:title="@string/font_12"/>
- <item
- android:id="@+id/font_14"
- android:title="@string/font_14"/>
- <item
- android:id="@+id/font_16"
- android:title="@string/font_16"/>
- <item
- android:id="@+id/font_18"
- android:title="@string/font_18"/>
- </group>
- </menu>
- </item>
- <!-- 第二個選單項:普通選單-->
- <item
- android:id="@+id/plain_item"
- android:title="@string/palin_item"
- android:showAsAction="always|withText">
- </item>
- <!-- 第三個選單項:字型顏色-->
- <item
- android:title="@string/font_color"
- android:icon="@drawable/color"
- android:showAsAction="always|withText">
- <!-- 定義一組單選選單項 ,然後定義一組選單選項-->
- <menu>
- <group>
- <item
- android:id="@+id/red_font"
- android:title="@string/red_title"/>
- <item
- android:id="@+id/blue_font"
- android:title="@string/blue_title"/>
- <item
- android:id="@+id/green_font"
- android:title="@string/blue_title"/>
- </group>
- </menu>
- </item>
- </menu>
- package com.android.android_actionbar_2;
- import android.app.ActionBar;
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.Color;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuInflater;
- import android.view.MenuItem;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- ActionBar actionbar;
- private TextView txt;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- /1./獲取當前Activity的actionBar
- actionbar=getActionBar();
- }
- //2.將Xml資源新增到menu選單中
- public boolean onCreateOptionsMenu(Menu menu)
- {
- MenuInflater inflator=new MenuInflater(this);
- inflator.inflate(R.menu.menu, menu);
- return super.onCreateOptionsMenu(menu);
- }
- //3.響應並實現選單項功能
- public boolean onOptionsItemSelected(MenuItem mi)
- {
- if(mi.isCheckable())
- {
- mi.setChecked(true);
- }
- switch(mi.getItemId())
- {
- //設定字型大小
- case R.id.font_10:
- txt.setTextSize(10*2);
- break;
- case R.id.font_12:
- txt.setTextSize(12*2);
- break;
- case R.id.font_14:
- txt.setTextSize(14*2);
- break;
- //設定字型顏色
- case R.id.blue_font:
- txt.setTextColor(Color.BLUE);
- mi.setChecked(true);
- break;
- case R.id.green_font:
- txt.setTextColor(Color.GREEN);
- mi.setChecked(true);
- break;
- //設定普通選單響應
- case R.id.plain_item:
- Toast toast=Toast.makeText(MainActivity.this, "您單擊了普通選單", Toast.LENGTH_SHORT);
- toast.show();
- break;
- }
- return true;
- }
- }
3.啟用程式圖示導航
為了實現將應用程式圖示轉變成可以點選的圖示,可以呼叫ActionBar的以下方法: >setDisplayHomeAsUpEnabled(boolean showHomeAsUp):設定是否將應用程式圖示轉變成可點選的圖示,並在圖示上新增一個向左的箭頭; >setDisplayOptions(int options):通過傳入int型別變數來控制該ActionBar的顯示選項; >setDisplayShowHomeEnabled(boolean showHome):設定是否顯示應用程式的圖示; >setHomeButtonEnabled(boolean enabled):設定是否將應用程式圖示轉換變成可點選的按鈕; 原始碼實戰: 功能:將該Activity的程式圖示轉變成可點選的圖示,並控制用於單擊該圖示時返回程式的主Activity.
package com.example.actionbar;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
/**
* 專案名稱/版本號:Actionbar/v1.0
* 包 名:com.example.actionbar
* 類描述:啟用程式圖示導航.點選應用程式圖示,返回主介面
* 建立人:jiangdongguo
* 建立時間:2015-6-12 下午8:20:14
* 部落格地址:http://blog.csdn.net/u012637501
*/
public class ActionHome extends Activity {
private ActionBar actionBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//a.獲得ActionBar例項
actionBar = getActionBar();
//b.設定是否顯示應用程式圖示
actionBar.setDisplayShowHomeEnabled(true);
//c.設定是否將應用程式圖示轉換變成可點選的按鈕
actionBar.setHomeButtonEnabled(true);
//d.將應用程式圖示設定為可點選的按鈕並在圖示上新增向左箭頭
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
return super.onCreateOptionsMenu(menu);
}
/**
*選項選單的選單項被單擊後的回撥方法
* */
public boolean onOptionsItemSelected(MenuItem item) {
//判斷選單項是否能被點選,是則使能選單項
if(item.isChecked()){
item.setChecked(true);
}
//判斷單擊的是哪個選單項,並作出相應的響應
switch (item.getItemId()) {
case android.R.id.home:
Intent intent = new Intent(ActionHome.this,MainActivity.class);
startActivity(intent);
this.finish();
break;
default:
break;
}
return true;
}
}
效果演示:
4.使用View作為Action View
ActionBar上除了可以顯示普通的Action Item之外,還可以顯示普通的UI元件(widget)作為一個功能按鈕的替代。操作視圖提供了快速訪問行為而不改變活動或片段,且沒有替換動作欄。例如,如果你想實現搜尋動作,可以在action
bar中嵌入一個SearchView視窗部件。為了實現一個action view到動作欄中,我們可以使用actionLayout or actionViewClass屬性來指定一個佈局(xml)資源或者視窗部件widget到Action
Bar.具體操作:
>定義Action Item時,使用android:actionViewClass屬性指定Action View的實現類(widget);
>定義Action Item時,使用android:actionLayout屬性指定Action View對應的檢視(layout);
(1)選單資源res/menu/menu.xml
在選單資源中定義Action Item,但這Action Item使用的是Action View而不是不同的Action Item。
- <?xmlversion="1.0"encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Action Item為widget-->
- <item
- android:id="@+id/search"
- android:title="搜尋"
- android:orderInCategory="100"
- android:showAsAction="ifRoom|collapseActionView"
- android:actionViewClass="android.widget.SearchView"/>
- <!-- Action Item為檢視資源-->
- <item
- android:id="@+id/clock"
- android:title="模擬時鐘"
- android:orderInCategory="100"
- android:showAsAction="ifRoom|collapseActionView"
- android:actionLayout="@layout/clock"/>
- </menu>
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.menu, menu); //載入選單資源
- MenuItem searchItem = menu.findItem(R.id.search); //獲得MenuItem物件
- SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); //獲得Action檢視物件
- // Configure the search info and add any event listeners //為Action檢視物件註冊事件監聽器
- ...
- return super.onCreateOptionsMenu(menu);
- }