在上一篇文章(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() {@Overridepublic boolean onQueryTextSubmit(String s) {Toast.makeText(MainActivity.this,"提交文本:"+s,Toast.LENGTH_SHORT).show();return false;}@Overridepublic boolean onQueryTextChange(String s) {Toast.makeText(MainActivity.this,"当前文本:"+s,Toast.LENGTH_SHORT).show();return false;}});MenuItemCompat.setOnActionExpandListener(action_view,new MenuItemCompat.OnActionExpandListener() {@Overridepublic boolean onMenuItemActionExpand(MenuItem item) {Toast.makeText(MainActivity.this,"actionView展开了!",Toast.LENGTH_SHORT).show();return true;}@Overridepublic 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;}@Overridepublic 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() {@Overridepublic void onClick(View v) {Toast.makeText(mContext,"点吧",Toast.LENGTH_SHORT).show();}});return view;}@Overridepublic 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() {@Overridepublic 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;}@Overridepublic 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();}@Overridepublic void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {if(mFragment!=null){fragmentTransaction.detach(mFragment);}Toast.makeText(mActivity,tab.getText()+"onTabUnselected",Toast.LENGTH_SHORT).show();}@Overridepublic 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/ 
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/jerehedu/p/4514772.html

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

  1. Android中导航栏之搜索框SearchView

    Toolbar系列文章导航 Android中导航栏之Toolbar的使用 Android中导航栏之溢出菜单OverflowMenu Android中导航栏之搜索框SearchView Android中 ...

  2. 转载:Android底部导航栏,三种风格和实现

    原文出处 标题:Android底部导航栏,三种风格和实现 作者:阿飞__ 原文链接:Android底部导航栏,三种风格和实现_阿飞__的博客-CSDN博客_android导航栏 一.效果图展示 如果动 ...

  3. Android底部导航栏的三种风格实现

    一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Goo ...

  4. Android底部导航栏切换页面填坑

    ** Android底部导航栏切换页面填坑 ** 这个效果的实现关键点就是给选项赋予两种状态,focused和normal,在主程序中用监听判断是否被选中,就给被选中的选项设focused为true, ...

  5. Android底部导航栏最常用的两种写法

    先来看看底部导航栏的效果 Android 底部导航栏有很多种写法,例如: RadioGroup , Tablayout, TabHost  , LinearLayout + ImageView + T ...

  6. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...

    现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信.购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...

  7. Android中导航栏之溢出菜单OverflowMenu

    Toolbar系列文章导航 Android中导航栏之Toolbar的使用 Android中导航栏之溢出菜单OverflowMenu Android中导航栏之搜索框SearchView Android中 ...

  8. Android底部导航栏+消息提醒

    Android底部导航栏+消息提醒 最近想在网上找一些Android底部导航栏切换并能提供消息提醒的案例,虽然有很多案例但都不是我想要的.我就开始自己瞎研究了,废话不多说了,直接上代码. 1.先创建一 ...

  9. android 固定底部导航,如何设置android底部导航栏位置固定在android

    请帮我设置底部导航栏位置固定在底部, ,因为我在输入editText字段时遇到问题,底部导航栏向上移动并覆盖其他领域如何设置android底部导航栏位置固定在android 代码: xmlns:and ...

最新文章

  1. 2018年黑龙江各口岸进口俄大豆80.3万吨 同比增长60.1%
  2. 矩阵sum_推荐系统——从协同过滤到矩阵分解
  3. ubuntu tail、history|grep 、alias命令
  4. 学习ASP.NET Core Razor 编程系列十八——并发解决方案
  5. 为你总结了N个真实线上故障,从容应对面试官!
  6. spring-cloud学习demo,git地址
  7. OSGI概念理解和入门
  8. Git版本管理工具常用命令整理和说明
  9. Token九重天——如何设计区块链项目的通证模型
  10. Spring框架与J2EE框架
  11. log_archive_dest_2参数配置错误导致的dataguard主库无法传文件到备库
  12. Gym 100962J Jimi Hendrix (DFS + 树形dp)
  13. 小米拒绝权限_手机用户隐私保护升级:小米MIUI 11支持“空信息授权”
  14. CIO40: 2020年IT人员如何借机破局
  15. windows10商店无法联网OneNote无法联网
  16. 流程定义语言(BPMN)
  17. “宫里过大年”数字沉浸体验展开幕 门神居然会动?
  18. “三门问题”背后的概率论原理解析
  19. SELECT语句的使用
  20. 公司以最低工资标准缴纳五险一金,工资分成2次发放合法吗?

热门文章

  1. ML的BD框架-Hadoop.Mahout.Strom.Spark/GraphLab
  2. Debian 9 中设置网络
  3. 从零实现一个自定义 HTML5 播放器
  4. Mysql 架构及优化之-索引优化
  5. Phonegap + JqueryMobile常见问题
  6. 【javascript权威指南】类型转换
  7. wordpress主题部署到github pages(调研+具体操作-还没有完成)
  8. TPU和GPU跑模型时间统计(持续更新中)以及TPU Research Cloud的申请
  9. 通俗讲清楚为什么使用信息熵增益比而不是信息熵增益?
  10. 04_ReplaceBlank