Android之ActionBar
本文主要包括以下內(nèi)容
ActionBar介紹
在Android 3.0中除了我們重點(diǎn)講解的Fragment外,Action Bar也是一個(gè)非常重要的交互元素,Action Bar取代了傳統(tǒng)的tittle bar和menu,在程序運(yùn)行中一直置于頂部,對(duì)于Android平板設(shè)備來(lái)說(shuō)屏幕更大它的標(biāo)題使用Action Bar來(lái)設(shè)計(jì)可以展示更多豐富的內(nèi)容,方便操控
ActioinBar功能
<1> ActionBar的圖標(biāo),可顯示軟件圖標(biāo),也可用其他圖標(biāo)代替。當(dāng)軟件不在最高級(jí)頁(yè)面時(shí),圖標(biāo)左側(cè)會(huì)顯示一個(gè)左箭頭,用戶(hù)可以通過(guò)這個(gè)箭頭向上導(dǎo)航;
<2> 如果你的應(yīng)用要在不同的View中顯示數(shù)據(jù),這部分允許用戶(hù)來(lái)切換視圖。一般的作法是用一個(gè)下拉菜單或者是Tab選項(xiàng)卡。如果只有一個(gè)界面,那這里可以顯示應(yīng)用程序的標(biāo)題或者是更長(zhǎng)一點(diǎn)的商標(biāo)信息;
<3> 兩個(gè)action按鈕,這里放重要的按鈕功能,為用戶(hù)進(jìn)行某項(xiàng)操作提供直接的訪問(wèn);
<4> overflow按鈕,放不下的按鈕會(huì)被置于“更多…”菜單項(xiàng)中,“更多…”菜單項(xiàng)是以下拉形式實(shí)現(xiàn)的
ActionBar修改文字與圖標(biāo)
第一種方法
<applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:logo="@drawable/cnblog_icon"android:supportsRtl="true"android:theme="@style/AppTheme">在mainfest文件中設(shè)置label與logo,但圖片卻顯示不出來(lái),所心采用第二種方式,在代碼中改變
ActionBar actionBar = getSupportActionBar();actionBar.setDisplayShowHomeEnabled(true);actionBar.setLogo(R.mipmap.ic_launcher);actionBar.setDisplayUseLogoEnabled(true);setTitle("abc");添加按鈕
ActionBar還可以根據(jù)應(yīng)用程序當(dāng)前的功能來(lái)提供與其相關(guān)的Action按鈕,這些按鈕都會(huì)以圖標(biāo)或文字的形式直接顯示在ActionBar上。當(dāng)然,如果按鈕過(guò)多,ActionBar上顯示不完,多出的一些按鈕可以隱藏在overflow里面(最右邊的三個(gè)點(diǎn)就是overflow按鈕),點(diǎn)擊一下overflow按鈕就可以看到全部的Action按鈕了。
當(dāng)Activity啟動(dòng)的時(shí)候,系統(tǒng)會(huì)調(diào)用Activity的onCreateOptionsMenu()方法來(lái)取出所有的Action按鈕,我們只需要在這個(gè)方法中去加載一個(gè)menu資源,并把所有的Action按鈕都定義在資源文件里面就可以了。
那么我們先來(lái)看下menu資源文件該如何定義,代碼如下所示:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/user_p"android:icon="@drawable/icon_user_p"android:showAsAction="always"android:title="用戶(hù)"/><item android:id="@+id/write_p"android:icon="@drawable/icon_write_p"android:showAsAction="always"android:title="發(fā)布"/><item android:id="@+id/favo_p"android:icon="@drawable/icon_favo_p"android:showAsAction="never"android:title="收藏"/></menu>接著,重寫(xiě)Activity的onCreateOptionsMenu()方法,代碼如下所示:
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_main, menu); return super.onCreateOptionsMenu(menu); }響應(yīng)Action按鈕的點(diǎn)擊事件
當(dāng)用戶(hù)點(diǎn)擊Action按鈕的時(shí)候,系統(tǒng)會(huì)調(diào)用Activity的onOptionsItemSelected()方法,通過(guò)方法傳入的MenuItem參數(shù),我們可以調(diào)用它的getItemId()方法和menu資源中的id進(jìn)行比較,從而辨別出用戶(hù)點(diǎn)擊的是哪一個(gè)Action按鈕,比如:
@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) { case R.id.user_p: Toast.makeText(this, "你點(diǎn)擊了“用戶(hù)”按鍵!", Toast.LENGTH_SHORT).show(); return true; case R.id.write_p: Toast.makeText(this, "你點(diǎn)擊了“發(fā)布”按鍵!", Toast.LENGTH_SHORT).show(); return true; case R.id.favo_p: Toast.makeText(this, "你點(diǎn)擊了“收藏”按鍵!", Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } }效果如下
返回主頁(yè)實(shí)現(xiàn)
首先設(shè)置setDisplayHomeAsUpEnable
ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true);第二步需要在AndroidManifest.xml中配置父Activity,如下所示:
<activity android:name="com.yanis.actionbar.TabActivity"android:parentActivityName="com.yanis.actionbar.MainActivity" > </activity>第三步則需要對(duì)android.R.id.home這個(gè)事件進(jìn)行一些特殊處理,如下所示,重寫(xiě)方法:
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { TaskStackBuilder.create(this) .addNextIntentWithParentStack(upIntent) .startActivities(); } else { upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); NavUtils.navigateUpTo(this, upIntent); } return true; ...... } }添加ActionView
ActionView是一種可以在ActionBar中替換Action按鈕的控件,它可以允許用戶(hù)在不切換界面的情況下通過(guò)ActionBar完成一些較為豐富的操作。比如說(shuō),你需要完成一個(gè)搜索功能,就可以將SeachView這個(gè)控件添加到ActionBar中。
為了聲明一個(gè)ActionView,我們可以在menu資源中通過(guò)actionViewClass屬性來(lái)指定一個(gè)控件
<itemandroid:id="@+id/action_search"android:actionViewClass="android.widget.SearchView"android:showAsAction="always"android:title="搜索"/>但這種寫(xiě)法似乎有兼容性問(wèn)題,無(wú)法達(dá)到效果,在item中將actionViewClass去除,在代碼中實(shí)現(xiàn)
MenuItem item=menu.findItem(R.id.action_search);item.setActionView(R.layout.searchview);其中searchView如下
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><SearchView android:layout_width="match_parent"android:layout_height="wrap_content"></SearchView></LinearLayout>添加Action Provider
和Action View有點(diǎn)類(lèi)似,Action Provider也可以將一個(gè)Action按鈕替換成一個(gè)自定義的布局。但不同的是,Action Provider能夠完全控制事件的所有行為,并且還可以在點(diǎn)擊的時(shí)候顯示子菜單。
為了添加一個(gè)Action Provider,我們需要在標(biāo)簽中指定一個(gè)actionViewClass屬性,在里面填入Action Provider的完整類(lèi)名。我們可以通過(guò)繼承ActionProvider類(lèi)的方式來(lái)創(chuàng)建一個(gè)自己的Action Provider,同時(shí),Android也提供好了幾個(gè)內(nèi)置的Action Provider,比如說(shuō)ShareActionProvider。
由于每個(gè)Action Provider都可以自由地控制事件響應(yīng),所以它們不需要在onOptionsItemSelected()方法中再去監(jiān)聽(tīng)點(diǎn)擊事件,而是應(yīng)該在onPerformDefaultAction()方法中去執(zhí)行相應(yīng)的邏輯。
那么我們就先來(lái)看一下ShareActionProvider的簡(jiǎn)單用法吧,編輯menu資源文件,在里面加入ShareActionProvider的聲明,如下所示:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/action_share" android:actionProviderClass="android.widget.ShareActionProvider" android:showAsAction="ifRoom" android:title="分享" /> ... </menu>接著剩下的事情就是通過(guò)Intent來(lái)定義出你想分享哪些東西了,我們只需要在onCreateOptionsMenu()中調(diào)用MenuItem的getActionProvider()方法來(lái)得到該ShareActionProvider對(duì)象,再通過(guò)setShareIntent()方法去選擇構(gòu)建出什么樣的一個(gè)Intent就可以了。代碼如下所示:
@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.menu_main, menu);MenuItem shareItem = menu.findItem(R.id.action_share);ShareActionProvider provider = (ShareActionProvider) shareItem.getActionProvider();provider.setShareIntent(getDefaultIntent());return super.onCreateOptionsMenu(menu);}private Intent getDefaultIntent() {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("image/*");return intent;}但shareItem.getActionProvider()會(huì)得到空指針異常,所以修改為
@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.menu_main, menu);MenuItem shareItem = menu.findItem(R.id.action_share);ShareActionProvider provider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);provider.setShareIntent(getDefaultIntent());return super.onCreateOptionsMenu(menu);}private Intent getDefaultIntent() {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("image/*");return intent;}效果如下
添加導(dǎo)航Tab
Tabs的應(yīng)用可以算是非常廣泛了,它可以使得用戶(hù)非常輕松地在你的應(yīng)用程序中切換不同的視圖。而Android官方更加推薦使用ActionBar中提供的Tabs功能,因?yàn)樗拥闹悄?#xff0c;可以自動(dòng)適配各種屏幕的大小。比如說(shuō),在平板上屏幕的空間非常充足,Tabs會(huì)和Action按鈕在同一行顯示
主要有三步
下面我們就來(lái)看一下如何使用ActionBar提供的Tab功能,大致可以分為以下幾步:
2.為每一個(gè)你想添加的Tab創(chuàng)建一個(gè)ActionBar.Tab的實(shí)例,并且調(diào)用setTabListener()方法來(lái)設(shè)置ActionBar.TabListener。除此之外,還需要調(diào)用setText()方法來(lái)給當(dāng)前Tab設(shè)置標(biāo)題。
3.最后調(diào)用ActionBar的addTab()方法將創(chuàng)建好的Tab添加到ActionBar中。
詳情見(jiàn)【Android UI設(shè)計(jì)與開(kāi)發(fā)】8.頂部標(biāo)題欄(一)ActionBar 奧義·詳解 - 葉超Luka - 博客園
主要需要注意到在用Android Studio開(kāi)發(fā)時(shí),使用ActionBar actionBar = getActionBar();會(huì)得到空指針異常,所以要全部改成ActionBar actionBar = getSupportActionBar();其中ActionBar來(lái)自于import android.support.v7.app.ActionBar;
效果如下
添加下拉列表導(dǎo)航
.1 簡(jiǎn)單介紹
作為Activity內(nèi)部的另一種導(dǎo)航(或過(guò)濾)模式,操作欄提供了內(nèi)置的下拉列表。下拉列表能夠提供Activity中內(nèi)容
的不同排序模式。
啟用下拉式導(dǎo)航的基本過(guò)程如下:
<1> 創(chuàng)建一個(gè)給下拉提供可選項(xiàng)目的列表,以及描畫(huà)列表項(xiàng)目時(shí)所使用的布局;
<2> 實(shí)現(xiàn)ActionBar.OnNavigationListener回調(diào),在這個(gè)回調(diào)中定義當(dāng)用戶(hù)選擇列表中一個(gè)項(xiàng)目時(shí)所發(fā)生的行為;
<3> 用setNavigationMode()方法該操作欄啟用導(dǎo)航模式;
<4> 用setListNavigationCallbacks()方法給下拉列表設(shè)置回調(diào)方法。
實(shí)現(xiàn)
準(zhǔn)備列表數(shù)據(jù)( strings.xml)
<string-array name="action_list"><item>Fragment1</item><item>Fragment2</item><item>Fragment3</item></string-array>``` 主界面代碼package com.yanis.actionbar;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.app.Activity;
import android.app.Fragment;
import android.app.TaskStackBuilder;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.SpinnerAdapter;
public class ListActivity extends Activity {
private OnNavigationListener mOnNavigationListener;
private String[] arry_list;
}
“`
主要是要將getFragmentManager改成getSupportFragmentManager應(yīng)對(duì)版本問(wèn)題
效果如下:
參考鏈接:
【Android UI設(shè)計(jì)與開(kāi)發(fā)】8.頂部標(biāo)題欄(一)ActionBar 奧義·詳解 - 葉超Luka - 博客園
github代碼地址
總結(jié)
以上是生活随笔為你收集整理的Android之ActionBar的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DL中常用的numpy
- 下一篇: Android缓存学习入门