在上一篇文章(Android之官方導航欄ActionBar)中,我們介紹了ActionBar各組成部分的基本應用。ActionBar除了提供Action Buttons外,還提供了多種導航方式如 Action View、Action Provider、Navigation Tabs、Drop-down Navigation等,下面我們將具體介紹他們的用法。
一、Action View |
首先來看Action View,action view是用於替換action button並顯示在action bar上面的一種可視組件。在此一SearchView為例,先上效果圖:
先上menu.xml文件,如下
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <item android:id="@+id/action_search_actionview" android:title="搜索" android:icon="@drawable/biz_pc_list_search_icon_dark" app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="android.support.v7.widget.SearchView" /> </menu>
showAsAction屬性在上篇文章已經講過,在這里大家要注意的是collapseActionView這個屬性值,此屬性會將action view折疊到一個按鈕中,用戶點擊的時候才會展開。
ActionViewClass屬性用於指定action view的類,這里的SearchView是系統提供的,我們也可以自定義。
當我們需要監聽ActionView的相關事件時,我們需要在方法onCreateOptionsMenu()中取得SearchView對象,具體如下:
1、3.0之前:
MenuItem action_view = menu.findItem(R.id.action_search_actionview);
SearchView searchView = (SearchView)MenuItemCompat.getActionView(action_view);
2、3.0之后:
menu.findItem(R.id.action_search_actionview).getActionView();
在得到SearchView對象后,我們可以監聽SearchView的相關事件,如SearchView的打開關閉;當SearchView中搜索文本發生變化或者提交搜索信息時,具體如下:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { Toast.makeText(MainActivity.this,"提交文本:"+s,Toast.LENGTH_SHORT).show(); return false; } @Override public boolean onQueryTextChange(String s) { Toast.makeText(MainActivity.this,"當前文本:"+s,Toast.LENGTH_SHORT).show(); return false; } }); MenuItemCompat.setOnActionExpandListener(action_view,new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { Toast.makeText(MainActivity.this,"actionView展開了!",Toast.LENGTH_SHORT).show(); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { Toast.makeText(MainActivity.this,"actionView關閉了!",Toast.LENGTH_SHORT).show(); return true; } });
二、Action provider |
Action provider同ActionView 類似可以替換ActionBar中的Action Button,不同的是Action Provider提供子菜單的方式,下面我們以系統提供的ShareActionProvider來講解Action Provider的用法,同樣,先上效果圖:
Menu.xml的代碼如下:
<item android:id="@+id/action_provider_share" android:title="分享" android:icon="@drawable/ic_launcher" app:showAsAction="ifRoom" app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
這里最主要的屬性就是 actionProviderClass,此屬性用於指定ActionProvider。
Java代碼如下:
MenuItem shareItem = menu.findItem(R.id.action_provider_share); ShareActionProvider mShareActionProvider =(ShareActionProvider)MenuItemCompat.getActionProvider(shareItem); Intent shareIntent = new Intent(); shareIntent.setType("image/*"); mShareActionProvider.setShareIntent(shareIntent);
那么我們如何自定義實現一個ActionProvider呢?很簡單,我們只需要繼承ActionProvider即可,然后實現onCreateActionView、onPerformDefaultAction,並提供構造函數,具體內容如下:
public class MyActionProvider extends ActionProvider { private Context mContext; /** * Creates a new instance. * * @param context Context for accessing resources. */ public MyActionProvider(Context context) { super(context); this.mContext = context; } @Override public View onCreateActionView() { View view = LayoutInflater.from(this.mContext).inflate(R.layout.action_provider_layout,null,false); Button btnOk = (Button)view.findViewById(R.id.btnOk); btnOk.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext,"點吧",Toast.LENGTH_SHORT).show(); } }); return view; } @Override public boolean onPerformDefaultAction(){ //處於action flow時,選中時調用 Toast.makeText(mContext,"點吧",Toast.LENGTH_SHORT).show(); return true; } }
效果如下:
三、Drop-Down Navigation |
Drop-Down Navigation提供了下拉形式的導航方式,同樣先看效果:
實現此種導航的只要需要如下四步:
1、 自定義適配器,實現SpinnerAdaper接口,或者使用系統提供ArrayAdapter等。
2、 實現ActionBar.OnNavigationListerner接口,用於響應用戶對drop-down list的內容的選擇。
3、 設置ActionBar的導航方式為NAVIGATION_MODE_LIST
4、 設置ActionBar的setListNavigatioinCallbacks()
代碼具體如下:
final String[] data=new String[]{"Java","Android","Oracle"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,data); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); actionBar.setListNavigationCallbacks(adapter,new ActionBar.OnNavigationListener() { @Override public boolean onNavigationItemSelected(int i, long l) { String tmp = data[i]; Toast.makeText(MainActivity.this,"你選擇了:"+tmp,Toast.LENGTH_SHORT).show(); return true; } });
四、Navigation Tabs |
Navigation Tabs提供了Tab頁形式的導航,效果如下:
Tabs主要和Fragment結合使用,下面是具體的操作步驟:
1、 實現ActionBar.TabListener接口,此接口主要用於監聽Tab的切換事件,主要有三個方法需要實現
a) onTabSelected:tab被選中時的回調
b) onTabUnselected:tab從選中到沒有選中時的回調。
c) onTabReselected:選中已被選中的tab時的回調。
2、 創建Tab並為Tab設置屬性和TabListener監聽
3、 將Tab添加到ActionBar中
Tab監聽器的代碼如下:
private static class TabListener<T extends Fragment> implements ActionBar.TabListener{ private Fragment mFragment; private Activity mActivity; private String mTag; private Class<T> mClass; private String mTitle; public TabListener(Activity activity,String tag,Class<T> clz,String title){ mActivity =activity; mTag = tag; mClass = clz; mTitle = title; } @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { if(mFragment==null){ mFragment= Fragment.instantiate(mActivity,mClass.getName()); Bundle bundle = new Bundle(); bundle.putString("name",mTitle); mFragment.setArguments(bundle); fragmentTransaction.add(R.id.content,mFragment,mTag); }else{ fragmentTransaction.attach(mFragment); } Toast.makeText(mActivity,tab.getText()+"onTabSelected",Toast.LENGTH_SHORT).show(); } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { if(mFragment!=null){ fragmentTransaction.detach(mFragment); } Toast.makeText(mActivity,tab.getText()+"onTabUnselected",Toast.LENGTH_SHORT).show(); } @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { Toast.makeText(mActivity,tab.getText()+"onTabReselected",Toast.LENGTH_SHORT).show(); } } 添加Tab的方法如下: private void initActionBarTabs(ActionBar actionBar){ ActionBar.Tab tab1 = actionBar.newTab(); tab1.setText("撥號").setTabListener(new TabListener<TabFragment>(this,"bohao",TabFragment.class,"撥號")); actionBar.addTab(tab1); ActionBar.Tab tab2 = actionBar.newTab(); tab2.setText("聯系人").setTabListener(new TabListener<TabFragment>(this,"lxr",TabFragment.class,"聯系人")); actionBar.addTab(tab2); ActionBar.Tab tab3 = actionBar.newTab(); tab3.setText("信息").setTabListener(new TabListener<TabFragment>(this,"xx",TabFragment.class,"信息")); actionBar.addTab(tab3); }
想要了解更多內容的小伙伴,可以點擊查看源碼,親自運行測試。
出處: http://www.cnblogs.com/jerehedu/
本文版權歸煙台傑瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。