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://www.cnblogs.com/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Android官方导航栏ActionBar(二)—— Action View、Action Provider、Navigation Tabs的详细用法的更多相关文章
- android之官方导航栏ActionBar(三)之高仿优酷首页
一.问题概述 通过上两篇文章,我们对如何使用ActionBar大致都已经有了认识.在实际应用中,我们更多的是定制ActionBar,那么就需要我们重写或者定义一些样式来修饰ActionBar,来满足具 ...
- Android之官方导航栏ActionBar
一.ActionBar概述 ActionBar是android3.0以后新增的组件,主要用于标示应用程序以及用户所处的位置并提供相关操作以及全局的导航功能.下面我们就看看如何使用ActionBar,真 ...
- Android之官方导航栏之Toolbar(Toolbar+DrawerLayout+ViewPager+PagerSlidingTabStrip)
通过前几篇文章,我们对Android的导航栏有了一定的了解认识,本次文章将对Toolbar进行综合应用,主要结合DrawerLayout.ViewPager.PagerSlidingTabStrip一 ...
- Android底部导航栏——FrameLayout + RadioGroup
原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6285881.html Android底部导航栏有多种实现方式,本文详细介绍FrameLayout ...
- Android底部导航栏创建——ViewPager + RadioGroup
原创文章,引用请注明出处:http://www.cnblogs.com/baipengzhan/p/6270201.html Android底部导航栏有多种实现方式,本文详解其中的ViewPager ...
- Android底部导航栏
Android底部导航栏 今天简单写了一个底部导航栏,封装了一个库,用法比较简单 效果图 Github地址:https://github.com/kongqw/KqwBottomNavigation ...
- 导航栏和里面的View设置的是同一颜色值,实际运行又不一样.
导航栏和里面的View设置的是同一颜色值,实际运行又不一样.如何保证两者的颜色一致呢? 答案就是:( navigationBar.translucent = NO; ) 去除 导航条的分割线(黑 ...
- self.navigationController.navigationBar.translucent = YES航栏的属性默认 YES是透明效果并且主view不会偏移 NO是导航栏不透明 主view会向下偏移64px
交友:微信号 dwjluck2013 从iOS7开始,苹果对navigationBar进行了模糊处理,并把self.navigationController.navigationBar.translu ...
- Android导航栏ActionBar的具体分析
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/39378825 关于ActionBar,相信大家并不陌生,可是真正能够熟练使用的也不是许多,这 ...
随机推荐
- eclipse安装properties插件
点击“Help”--> Install New Software Name:propertiesLocation:http://propedit.sourceforge.jp/eclipse/u ...
- 性能测试三十九:Jprofiler分析CPU过高和响应时间长的问题
使用Jprofiler监控分析案例 一.cpu负载过高:http://localhost:8080/PerfTeach/CpuTopServlet?id=1 cpu消耗高的可能原因1.使用了复杂的算法 ...
- 双倍浮向(双倍边距)(只有IE6出现)
声明: web前端学习笔记,欢迎大神指点.联系QQ:1522025433. 描述:在IE6中,一个居左(或居右)浮动的元素放置进一个容器盒(box),并在浮动元素上使用了左边距(或右边距) 在ie6内 ...
- python 全栈开发,Day50(Javascript简介,第一个JavaScript代码,数据类型,运算符,数据类型转换,流程控制,百度换肤,显示隐藏)
一.Javascript简介 Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) Jav ...
- 【C++ Primer 第11章 练习答案】2. 关联容器概述
11.2.1节练习 [练习11.7]代码: #include<iostream> #include<string> #include<vector> #includ ...
- 记录weiye项目上线遇到的一些问题
1.使用vpn访问客户内网 参考:http://jingyan.baidu.com/article/a3f121e4f9903cfc9052bb0b.html 2.设置使用ip地址直接访问项目(之后可 ...
- Asp.Net Core 2.0 项目实战(5)Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- vue中mixin的一点理解
vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用.最开始我一度认为这个和组件好像没啥区别..后来发现错了.下面我们来看看mixins和普通情况下引入组件有什么区别? ...
- 【Java】 剑指offer(55-2) 平衡二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树 ...
- Unity 之 场景切换
Application.LoadLevel();//场景名称或索引,删除掉原场景的所有东西 Application.LoadLevelAdditive()//添加并加载场景,不删除当前场景的物体, ...