Android官方导航栏ActionBar(二)—— Action View、Action Provider、Navigation Tabs的详细用法

  在上一篇文章(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共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

时间: 2024-08-24 23:48:25

Android官方导航栏ActionBar(二)—— Action View、Action Provider、Navigation Tabs的详细用法的相关文章

android之官方导航栏ActionBar(三)之高仿优酷首页

一.问题概述 通过上两篇文章,我们对如何使用ActionBar大致都已经有了认识.在实际应用中,我们更多的是定制ActionBar,那么就需要我们重写或者定义一些样式来修饰ActionBar,来满足具体的需要.我们就以优酷首页为例,一起学习下ActionBar的综合应用. 二.Android系统ActionBar样式的定义 首先,我们先认识一下android系统中是如何定义ActionBar样式的,这里我们以Theme.Holo.Light主题为例,通过源码我们可以看到在该主题中关于Action

Android之官方导航栏ActionBar

一.ActionBar概述 ActionBar是android3.0以后新增的组件,主要用于标示应用程序以及用户所处的位置并提供相关操作以及全局的导航功能.下面我们就看看如何使用ActionBar,真正使用之前,我们应该首先了解一下ActionBar的结构. 根据官方文档,我们看到整个ActionBar可以分为4个部分,具体如下图: 1.  App icon:主要用于展示App的Logo,如果当前界面不是一级界面,还可以展示返回导航. 2.  View Control:用于切换不同的视图或者展示

Android之官方导航栏之Toolbar(Toolbar+DrawerLayout+ViewPager+PagerSlidingTabStrip)

通过前几篇文章,我们对Android的导航栏有了一定的了解认识,本次文章将对Toolbar进行综合应用,主要结合DrawerLayout.ViewPager.PagerSlidingTabStrip一起使用. PagerSlidingTabStrip是github上一个开源库,地址为:https://github.com/astuetz/PagerSlidingTabStrip DrawerLayout之前有过介绍,在此不在过多介绍. 先看布局文件: <RelativeLayout xmlns:

Android导航栏ActionBar的详细分析 一

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/39378825 关于ActionBar,相信大家并不陌生,但是真正能够熟练使用的也不是很多,这篇文章主要为大家详细介绍ActionBar的相关知识,ActionBar是在Android3.0中引入的概念,所以在2.x系统中使用ActionBar我们需要依赖ActionBarSherklock或者androi-support-v7库,ActionBarSherklock是anroid中非常有名

Android仿小米商城底部导航栏之二(BottomNavigationBar、ViewPager和Fragment的联动使用)

简介 在前文<Android仿小米商城底部导航栏(基于BottomNavigationBar)>我们使用BottomNavigationBar控件模仿实现了小米商城底部导航栏效果.接下来更进一步的,我们将通过BottomNavigationBar控件和ViewPager空间的联动使用来实现主界面的滑动导航. 导航是移动应用最重要的方面之一,对用户体验是良好还是糟糕起着至关重要的作用.好的导航可以让一款应用更加易用并且让用户快速上手.相反,糟糕的应用导航很容易让人讨厌,并遭到用户的抛弃.为了打造

Android自定义控件---导航栏SlideTab(Fragment+ViewPager)

一.前言 好久没有更新过博客了,趁今天有空分享一个导航栏的自定义控件.有关此控件的demo相信在网上已经烂大街了,一搜一大把. 我现在只着重分享一些我认为比较难理解的知识点.整个控件的难点大概有三个 1.游标的绘制. 2.ViewPager监听器的理解. 3.游标的移动. 本文将注重这三个方面重点分析. 先上Demo的最终效果 二.Demo结构图和知识点 样例Module,有四个java文件和两个xml文件 总结一下此控件的主要知识点 1.ViewGroup绘制流程. 2.ViewPager的用

IOS7 导航栏适配二

ios7下的app都是全屏的,意思就是所有控制器的view默认都是从  屏幕的 (0,0)开始. 这时候用到导航栏时,往往会出现被导航栏挡住情况. 最明显的是用到tableView时,第一行的数据会被导航栏遮盖 两种解决方法: 一.在控制器下设置导航控制器的导航栏的translucent(半透明)属性为NO,translucent属性在ios6之前默认为no,而在ios7下的导航栏默认却是半透明的,为yes,所以该属性不会占据空间.前提是你不需要导航栏半透明效果. 二.在控制器下设置导航控制器的

iOS 设置导航栏之二(设置导航栏的颜色、文字的颜色、左边按钮的文字及颜色)

                  #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end #import "AppDelegate.h" #import "KeyViewController.h" @interface Ap

Android底部导航栏

Android UI-仿微信底部导航栏布局 Android基础入门教程——5.2.1 Fragment实例精讲——底部导航栏的实现(方法1)