Android官方導覽列ActionBar(二)—— Action View、Action Provider、Navigation Tabs的詳細用法

來源:互聯網
上載者:User

標籤:

  在上一篇文章(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://blog.csdn.net/jerehedu/ 
本文著作權歸煙台傑瑞教育科技有限公司和CSDN共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。 

Android官方導覽列ActionBar(二)—— Action View、Action Provider、Navigation Tabs的詳細用法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.