Android之ActionBar
本文主要包括以下內容
ActionBar介紹
在Android 3.0中除了我們重點講解的Fragment外,Action Bar也是一個非常重要的交互元素,Action Bar取代了傳統的tittle bar和menu,在程序運行中一直置于頂部,對于Android平板設備來說屏幕更大它的標題使用Action Bar來設計可以展示更多豐富的內容,方便操控
ActioinBar功能
<1> ActionBar的圖標,可顯示軟件圖標,也可用其他圖標代替。當軟件不在最高級頁面時,圖標左側會顯示一個左箭頭,用戶可以通過這個箭頭向上導航;
<2> 如果你的應用要在不同的View中顯示數據,這部分允許用戶來切換視圖。一般的作法是用一個下拉菜單或者是Tab選項卡。如果只有一個界面,那這里可以顯示應用程序的標題或者是更長一點的商標信息;
<3> 兩個action按鈕,這里放重要的按鈕功能,為用戶進行某項操作提供直接的訪問;
<4> overflow按鈕,放不下的按鈕會被置于“更多…”菜單項中,“更多…”菜單項是以下拉形式實現的
ActionBar修改文字與圖標
第一種方法
<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文件中設置label與logo,但圖片卻顯示不出來,所心采用第二種方式,在代碼中改變
ActionBar actionBar = getSupportActionBar();actionBar.setDisplayShowHomeEnabled(true);actionBar.setLogo(R.mipmap.ic_launcher);actionBar.setDisplayUseLogoEnabled(true);setTitle("abc");添加按鈕
ActionBar還可以根據應用程序當前的功能來提供與其相關的Action按鈕,這些按鈕都會以圖標或文字的形式直接顯示在ActionBar上。當然,如果按鈕過多,ActionBar上顯示不完,多出的一些按鈕可以隱藏在overflow里面(最右邊的三個點就是overflow按鈕),點擊一下overflow按鈕就可以看到全部的Action按鈕了。
當Activity啟動的時候,系統會調用Activity的onCreateOptionsMenu()方法來取出所有的Action按鈕,我們只需要在這個方法中去加載一個menu資源,并把所有的Action按鈕都定義在資源文件里面就可以了。
那么我們先來看下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="用戶"/><item android:id="@+id/write_p"android:icon="@drawable/icon_write_p"android:showAsAction="always"android:title="發布"/><item android:id="@+id/favo_p"android:icon="@drawable/icon_favo_p"android:showAsAction="never"android:title="收藏"/></menu>接著,重寫Activity的onCreateOptionsMenu()方法,代碼如下所示:
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_main, menu); return super.onCreateOptionsMenu(menu); }響應Action按鈕的點擊事件
當用戶點擊Action按鈕的時候,系統會調用Activity的onOptionsItemSelected()方法,通過方法傳入的MenuItem參數,我們可以調用它的getItemId()方法和menu資源中的id進行比較,從而辨別出用戶點擊的是哪一個Action按鈕,比如:
@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) { case R.id.user_p: Toast.makeText(this, "你點擊了“用戶”按鍵!", Toast.LENGTH_SHORT).show(); return true; case R.id.write_p: Toast.makeText(this, "你點擊了“發布”按鍵!", Toast.LENGTH_SHORT).show(); return true; case R.id.favo_p: Toast.makeText(this, "你點擊了“收藏”按鍵!", Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } }效果如下
返回主頁實現
首先設置setDisplayHomeAsUpEnable
ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true);第二步需要在AndroidManifest.xml中配置父Activity,如下所示:
<activity android:name="com.yanis.actionbar.TabActivity"android:parentActivityName="com.yanis.actionbar.MainActivity" > </activity>第三步則需要對android.R.id.home這個事件進行一些特殊處理,如下所示,重寫方法:
@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按鈕的控件,它可以允許用戶在不切換界面的情況下通過ActionBar完成一些較為豐富的操作。比如說,你需要完成一個搜索功能,就可以將SeachView這個控件添加到ActionBar中。
為了聲明一個ActionView,我們可以在menu資源中通過actionViewClass屬性來指定一個控件
<itemandroid:id="@+id/action_search"android:actionViewClass="android.widget.SearchView"android:showAsAction="always"android:title="搜索"/>但這種寫法似乎有兼容性問題,無法達到效果,在item中將actionViewClass去除,在代碼中實現
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有點類似,Action Provider也可以將一個Action按鈕替換成一個自定義的布局。但不同的是,Action Provider能夠完全控制事件的所有行為,并且還可以在點擊的時候顯示子菜單。
為了添加一個Action Provider,我們需要在標簽中指定一個actionViewClass屬性,在里面填入Action Provider的完整類名。我們可以通過繼承ActionProvider類的方式來創建一個自己的Action Provider,同時,Android也提供好了幾個內置的Action Provider,比如說ShareActionProvider。
由于每個Action Provider都可以自由地控制事件響應,所以它們不需要在onOptionsItemSelected()方法中再去監聽點擊事件,而是應該在onPerformDefaultAction()方法中去執行相應的邏輯。
那么我們就先來看一下ShareActionProvider的簡單用法吧,編輯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>接著剩下的事情就是通過Intent來定義出你想分享哪些東西了,我們只需要在onCreateOptionsMenu()中調用MenuItem的getActionProvider()方法來得到該ShareActionProvider對象,再通過setShareIntent()方法去選擇構建出什么樣的一個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()會得到空指針異常,所以修改為
@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;}效果如下
添加導航Tab
Tabs的應用可以算是非常廣泛了,它可以使得用戶非常輕松地在你的應用程序中切換不同的視圖。而Android官方更加推薦使用ActionBar中提供的Tabs功能,因為它更加的智能,可以自動適配各種屏幕的大小。比如說,在平板上屏幕的空間非常充足,Tabs會和Action按鈕在同一行顯示
主要有三步
下面我們就來看一下如何使用ActionBar提供的Tab功能,大致可以分為以下幾步:
2.為每一個你想添加的Tab創建一個ActionBar.Tab的實例,并且調用setTabListener()方法來設置ActionBar.TabListener。除此之外,還需要調用setText()方法來給當前Tab設置標題。
3.最后調用ActionBar的addTab()方法將創建好的Tab添加到ActionBar中。
詳情見【Android UI設計與開發】8.頂部標題欄(一)ActionBar 奧義·詳解 - 葉超Luka - 博客園
主要需要注意到在用Android Studio開發時,使用ActionBar actionBar = getActionBar();會得到空指針異常,所以要全部改成ActionBar actionBar = getSupportActionBar();其中ActionBar來自于import android.support.v7.app.ActionBar;
效果如下
添加下拉列表導航
.1 簡單介紹
作為Activity內部的另一種導航(或過濾)模式,操作欄提供了內置的下拉列表。下拉列表能夠提供Activity中內容
的不同排序模式。
啟用下拉式導航的基本過程如下:
<1> 創建一個給下拉提供可選項目的列表,以及描畫列表項目時所使用的布局;
<2> 實現ActionBar.OnNavigationListener回調,在這個回調中定義當用戶選擇列表中一個項目時所發生的行為;
<3> 用setNavigationMode()方法該操作欄啟用導航模式;
<4> 用setListNavigationCallbacks()方法給下拉列表設置回調方法。
實現
準備列表數據( 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應對版本問題
效果如下:
參考鏈接:
【Android UI設計與開發】8.頂部標題欄(一)ActionBar 奧義·詳解 - 葉超Luka - 博客園
github代碼地址
總結
以上是生活随笔為你收集整理的Android之ActionBar的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DL中常用的numpy
- 下一篇: 【每日SQL打卡】