Android ActionBar使用教程
ActionBar的引入方式:
有幾種,從 Android 3.0(API lever 11) 開始,所有使用 Theme.Holo 主題(或者它的子類)的 Activity 都包含了 action bar,當(dāng) targetSdkVersion 或 minSdkVersion 屬性被設(shè)置成 “11” 或更大時(shí),它是默認(rèn)主題。為了兼容Android3.0之前的低版本,actionbar通常通過(guò)extends集成Support包下的AppCompatActivity實(shí)現(xiàn),同時(shí)需要使用Theme.AppCompat的ActionBar主題(想要去掉ActionBar使用Theme.AppCompat.NoActionBar主題或者Theme.Holo.NoActionBar主題即可)。
注:如果你想使用setSupportActionBar()方法的方式添加ActionBar,那么同時(shí)你想使用ActionBar的主題,那么就必須設(shè)置去除主題中的Actionbar,<item name="windowActionBar">false</item>,二者只能保留其一。否則會(huì)報(bào)錯(cuò):
java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
注:就算設(shè)置<item name="windowActionBar">false</item>,只要使用的是ActionBar的主題,ActionBar依然存在,原因暫時(shí)不知
V4包和V7包
V4包是為Android 1.6(API Level 4)及以上的版本設(shè)計(jì)的,它包含大部分高版本中有而低版本中沒(méi)有的API,包括application components、user interface features、accessibility、data handling、network connectivity、and programming utilities,提供對(duì)Fragment、ViewPager等Android3.0之后的高版本特性的兼容:
Fragment:通過(guò)它可以讓同一個(gè)程序適配不同的屏幕。
NotificationCompat:支持更豐富的通知形式;
LocalBroadcastManager: 用來(lái)在同一個(gè)應(yīng)用內(nèi)的不同組件間發(fā)送Broadcast。
V7包是Android 2.1(API Level 7)及以上的版本谷歌提供了一系列的support包
這個(gè)庫(kù)添加 Action Bar 用戶界面設(shè)計(jì)模式的支持。這個(gè)庫(kù)包括支持material design的用戶界面實(shí)現(xiàn)。
注意:這個(gè)庫(kù)依賴于v4 Support Library。
這里有一些包含在v7 appcompat庫(kù)中的關(guān)鍵類:
ActionBar:提供ActionBar用戶界面模式的實(shí)現(xiàn)
AppCompatActivity :增加一個(gè)Activity類,可以用作支持ActionBar實(shí)現(xiàn)的Activity的基類。
AppCompatDialog :添加一個(gè)對(duì)話框類,可以作為一個(gè)appcompat主題對(duì)話框基類。
ShareActionProvider :增加一個(gè)標(biāo)準(zhǔn)化的共享動(dòng)作(如電子郵件或發(fā)送到社交網(wǎng)站),包含在ActionBar中。
為了在3.0之前的版本中使用Fragment我們要繼承Support v4包下的FragmentActivity,如果想在3.0之前的版本使用ActionBar就需要繼承Support V7包下的ActionBarActivity,使用Theme.Holo系列主題,ActionBarActivity是繼承自FragmentActivity的。Android5.0之后V7包更新,使用ActionBar可以繼承V7包中的AppCompatActivity,同時(shí)提供了一系列新的ActionBar的主題(Theme.AppCompat )
1.添加左側(cè)返回按鈕:
在清單文件 中為Activity添加上級(jí)Activity:android:parentActivityName=".activity.ImageShowActivity"
同時(shí)調(diào)用ActionBar的setDisplayHomeAsUpEnabled(true)方法設(shè)置左上角返回圖標(biāo),默認(rèn)是左箭頭
getSupportActionBar().setDisplayHomeAsUpEnabled(true); // 如果你的minSdkVersion屬性是11或更高, 應(yīng)該這么用: // getActionBar().setDisplayHomeAsUpEnabled(true);
注:如果你的編譯版本compileSdkVersion 23高于Android5.0(API level 21),只用在Manifest文件中聲明父級(jí)Activity即可。比21更低版本未測(cè)試。同時(shí)如果主動(dòng)設(shè)置了getActionBar().setDisplayHomeAsUpEnabled(false);則一定會(huì)取消返回按鈕
注:回退Activity的一個(gè)技巧:Itent對(duì)象中包括FLAG_ACTIVITY_CLEAR_TOP標(biāo)識(shí)。用這個(gè)標(biāo)記,如果你要啟動(dòng)的Activity在當(dāng)前任務(wù)中已經(jīng)存在,那么,堆棧中這個(gè)Activity之上的所有的Activity都有被銷毀,并且把這個(gè)Activity顯示給用戶。
注:這種返回不會(huì)保留之前Activity中的數(shù)據(jù),也不能使用onSaveInstance() 方法保存
這時(shí)候需要進(jìn)行特殊處理,在復(fù)寫的onOptionsItemSelected方法中,判斷當(dāng)前Activity和目標(biāo)父級(jí)Activity實(shí)例是否在同一個(gè)任務(wù)棧,在同一個(gè)任務(wù)棧就清空目標(biāo)父級(jí)Activity實(shí)例之上的實(shí)例,并在同一個(gè)任務(wù)棧啟動(dòng)目標(biāo)父級(jí)實(shí)例。否則新建一個(gè)任務(wù)棧啟動(dòng)。這么處理的初衷是這里的向上導(dǎo)航是與回退簡(jiǎn)單finish掉實(shí)例相區(qū)別的,這里希望跨越式的回到主Activity。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
ToastUtils.show(this, "home");
Intent upIntent = NavUtils.getParentActivityIntent(this);
//判斷當(dāng)前Activity在向上導(dǎo)航到目標(biāo)Intent upIntent是否需要重建新的任務(wù)棧,
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
//重建新的任務(wù)棧
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
//使用當(dāng)前任務(wù)棧
upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//清空任務(wù)棧中目標(biāo)Activity實(shí)例之上的所有實(shí)例
NavUtils.navigateUpTo(this, upIntent);//直接在同一個(gè)任務(wù)棧跳轉(zhuǎn)
}
return true;//消費(fèi)掉事件
}
return super.onOptionsItemSelected(item);
}
自定義Home:
同時(shí)取消顯示左上角返回按鈕
/*設(shè)置左上角Logo Icon*/
actionBar.setLogo(R.drawable.go_back_64px);//(單獨(dú)設(shè)置沒(méi)作用)
actionBar.setDisplayShowHomeEnabled(true);//是否顯示Logo,必須為他setLogo()才起作用
actionBar.setDisplayUseLogoEnabled(true);//是否使用Activity的Logo,即setLogo()方法設(shè)置的Logo
actionBar.setDisplayHomeAsUpEnabled(false);//是否顯示左上角默認(rèn)的返回按鈕
actionBar.setHomeButtonEnabled(false);//按鈕是否可以點(diǎn)擊(實(shí)測(cè)無(wú)用,false下依然可以點(diǎn)擊--已經(jīng)設(shè)置了該Activity的父級(jí)Activity)
設(shè)置標(biāo)題的顏色:
根據(jù)測(cè)試直接在Activity的主題中或者ActionBar的主題中進(jìn)行設(shè)置是不生效的。可以通過(guò)為Activity或者Actionbar主題設(shè)置titleTextStyle屬性,添加文字的主題風(fēng)格,該風(fēng)格需要繼承自@android:style/TextAppearance:
<!--設(shè)置標(biāo)題的顏色,注意使用兼容包下的屬性-->
<item name="android:titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>
<item name="titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>
<style name="MyTheme.ActionBar.TitleTextStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
<item name="android:textColor">@color/blue</item>
<item name="android:textSize">16sp</item>
</style>
注意若是使用了Support中的ActionBar就需要使用屬性titleTextStyle而不是android:titleTextStyle,否則設(shè)置的顏色也不會(huì)生效。
設(shè)置Actionbar浮動(dòng):
做法是:在不要顯示ActionBar的時(shí)候使用hide()方法隱藏
重寫Activity的onTouchEvent()方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d("debug", "onTouchEvent");
if (actionBar == null) {
actionBar = getSupportActionBar();
}
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
// if (actionBar != null) {
if (actionBar.isShowing()) {
//隱藏
actionBar.hide();
} else {
//顯示
actionBar.show();
}
// }
break;
}
return super.onTouchEvent(event);
}
設(shè)置Actionbar隱藏時(shí)不重繪Activity的布局:
在 action bar 隱藏和顯示過(guò)程中調(diào)整布局的大小,很影響視覺(jué)體驗(yàn)。
需要APi level 19 及之上:設(shè)置內(nèi)容填充系統(tǒng)狀態(tài)欄,不存在重新布局的問(wèn)題了
或者為Activity主題添加屬性:
<item name="android:windowTranslucentStatus">true</item>
官方文檔給出的方法是:設(shè)置疊加模式,不限版本
<item name="android:windowActionBarOverlay">true</item>
<!-- 兼容支持庫(kù) -->
<item name="windowActionBarOverlay">true</item>
設(shè)置系統(tǒng)狀態(tài)欄
在android4.4之前,在App的上方總是保留著黑乎乎的系統(tǒng)狀態(tài)欄,在4.4之后引入了透明狀態(tài)欄效果(Translucent System Bar),使App可以使用全部屏幕 ,同時(shí)使系統(tǒng)狀態(tài)欄和導(dǎo)航欄半透明
在Activity的主題中
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
//除此之外還可以設(shè)置系統(tǒng)狀態(tài)欄的顏色:適用于頁(yè)面是單純顏色:
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
此處參考:Translucent System Bar 的最佳實(shí)踐 - 安卓 - 伯樂(lè)在線
設(shè)置Menu菜單不遮擋AcionBar:
使用Support V7包下的ActionBar,默認(rèn)Menu菜單會(huì)頂?shù)狡聊坏捻敳?,遮擋到Actionbar,想要的效果是Menu位于ActionBar的下面。
在Activity的主題中添加屬性:actionOverflowMenuStyle
<!--設(shè)置menu菜單不遮擋actionbar-->
<item name="actionOverflowMenuStyle">@style/OverflowMenu</item>
//創(chuàng)建這個(gè)主題,繼承自主題Widget.AppCompat.PopupMenu
<style name="OverflowMenu" parent="Widget.AppCompat.PopupMenu.Overflow">
<!--兼容Api 21之前的版本 -->
<item name="overlapAnchor">true</item>
<!-- Api 21-->
<!--<item name="android:overlapAnchor">false</item>-->
</style>
消除左側(cè)按鈕的遺留空白:
設(shè)置不顯示左上角返回按鈕之后,它左邊的空白仍然在顯示。
設(shè)置Menu菜單:
1、取消menu菜單:
在復(fù)寫的onCreateOptionsMenu方法返回false即可,或者不復(fù)寫該方法。
設(shè)置Menu菜單按鈕的顏色:
注意設(shè)置Activity的主題而不是Actionbar的主題:
<!--設(shè)置menu的文字顏色-->
<!--<item name="actionMenuTextColor">@color/yellow</item>-->
<!--<item name="android:actionMenuTextColor">@color/yellow</item>-->
<!--上面兩個(gè)設(shè)置是無(wú)效的-->
<item name="android:itemTextAppearance">@style/myCustomMenuTextApearance</item>
<style name="myCustomMenuTextApearance" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
<!--文字顏色-->
<item name="android:textColor">@color/blue</item>
<!--文字大小-->
<item name="android:textSize">16sp</item>
</style>
2、設(shè)置Menu菜單的背景色:
也是在Activity的主題中進(jìn)行設(shè)置
<!--s設(shè)置Menu菜單的背景色-->
<item name="android:itemBackground">@color/black_light</item>
3、自定義Menu菜單項(xiàng):
除了使用系統(tǒng)給定的action,還可以自定義,這是需要使用action view and action provider,個(gè)人理解是可以提供視覺(jué)效果和交互功能的menu item。
同樣是在Menu中定義item,需要使用actionViewClass和actionLayout中的一個(gè),其中actionViewClass 指定使用的控件類名,如搜索控件SearchView,actionLayout指定自己定義的布局文件作為action的視圖。
actionViewClass: The class of a widget that implements the action.
actionLayout: A layout resource describing the action's components.
1).使用actionViewClass添加一個(gè)系統(tǒng)搜索item:
添加item:
<item android:id="@+id/action_search" android:title="@string/action_search" android:icon="@drawable/ic_search" app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="android.support.v7.widget.SearchView" />
處理搜索事件:通過(guò)menu的findItem()方法拿到控件的引用,綁定文本查詢的監(jiān)聽器
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
//找到ActionBar上所添加的UI組件的方法:
mSearchView = (SearchView) menu.findItem(R.id.searchItem).getActionView();
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String string) {
Toast.makeText(ShowImageActivity.this, "查詢:" + string, Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onQueryTextChange(String string) {
return true;
}
});
}
上面為item設(shè)置了app:showAsAction="ifRoom|collapseActionView"屬性,其中collapseActionView含義是沒(méi)有交互動(dòng)作時(shí)(未點(diǎn)擊時(shí))搜索item收起只顯示icon,有交互時(shí),item展開充滿actionbar剩余空間。搭配ifRoom表示有空間時(shí)展示到App bar上,沒(méi)空間時(shí)作為menu item.never表示一直作為menu item。always表示一直展示在App bar上。
2).使用actionLayout添加一個(gè)自定義的搜索控件
添加item
<item
android:id="@+id/custom_search"
android:icon="@drawable/ic_action_search"
android:title="custom_search"
app:actionLayout="@layout/search_layout"
app:showAsAction="collapseActionView|always|withText" />
布局文件:search_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="5dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:src="@drawable/ic_action_search" />
<EditText
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
同時(shí)如果設(shè)置了app:showAsAction="collapseActionView"這個(gè)屬性,還可以監(jiān)聽shouqi/展開事件:在onCreateOptionsMenu(Menu menu)方法中
MenuItem collapseActionView = menu.findItem(R.id.searchItem);
// Define the listener
MenuItemCompat.OnActionExpandListener expandListener = new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when action item collapses
ToastUtils.show(ShowImageActivity.this, "action item collapses");
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
ToastUtils.show(ShowImageActivity.this, "action item expanded");
return true; // Return true to expand action view
}
};
MenuItemCompat.setOnActionExpandListener(collapseActionView, expandListener);
以上就是Android ActionBar使用教程,希望對(duì)大家學(xué)習(xí)Android軟件編程有所幫助。
相關(guān)文章
Android編程實(shí)現(xiàn)抽屜效果的方法詳解
這篇文章主要介紹了Android編程實(shí)現(xiàn)抽屜效果的方法,結(jié)合具體實(shí)例形式分析了Android實(shí)現(xiàn)抽屜效果的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
Android RecyclerView滑動(dòng)刪除和拖動(dòng)排序
這篇文章主要介紹了Android RecyclerView滑動(dòng)刪除和拖動(dòng)排序的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07
Android仿滴滴出行驗(yàn)證碼輸入框功能實(shí)例代碼
最近項(xiàng)目經(jīng)理交給我們組一個(gè)類似滴滴出行填寫驗(yàn)證碼的彈框功能,拿到這個(gè)項(xiàng)目需求真是把我忙暈了,下面通過(guò)本文給大家分享Android仿滴滴出行驗(yàn)證碼輸入框功能實(shí)例代碼,需要的朋友參考下吧2017-12-12
安卓逆向騰訊動(dòng)漫app返回?cái)?shù)據(jù)加密分析案例分享
這篇文章主要為大家介紹了安卓逆向騰訊動(dòng)漫app返回?cái)?shù)據(jù)加密分析的案例分享,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
Android實(shí)例代碼理解設(shè)計(jì)模式SOLID六大原則
程序設(shè)計(jì)領(lǐng)域, SOLID (單一功能、開閉原則、里氏替換、接口隔離以及依賴反轉(zhuǎn))是由羅伯特·C·馬丁在21世紀(jì)早期 引入的記憶術(shù)首字母縮略字,指代了面向?qū)ο缶幊毯兔嫦驅(qū)ο笤O(shè)計(jì)的基本原則2021-10-10
Android開發(fā)使用自定義View將圓角矩形繪制在Canvas上的方法
這篇文章主要介紹了Android開發(fā)使用自定義View將圓角矩形繪制在Canvas上的方法,結(jié)合實(shí)例形式分析了Android自定義view繪制圓角矩形的相關(guān)方法與使用技巧,需要的朋友可以參考下2017-10-10
Android Room數(shù)據(jù)庫(kù)自動(dòng)升級(jí)與遷移的策略
在 Android 應(yīng)用開發(fā)中,Room 是 Google 提供的一個(gè)輕量級(jí)數(shù)據(jù)庫(kù)框架,用于簡(jiǎn)化與 SQLite 的交互,本文將介紹 Room 數(shù)據(jù)庫(kù)升級(jí)的幾種場(chǎng)景和常見的處理方法,包括手動(dòng)遷移和自動(dòng)遷移的策略,需要的朋友可以參考下2024-09-09

