文档章节

ActionBar学习笔记(二)

紫韵
 紫韵
发布于 2016/02/21 21:11
字数 1462
阅读 36
收藏 7

八、在ActionBar上添加导航tab

    Tabs的应用可以算是非常广泛了,它可以使得用户非常轻松地在你的应用程序中切换不同的视图。而Android官方更加推荐使用ActionBar中提供的Tabs功能,因为它更加的智能,可以自动适配各种屏幕的大小。

    为ActionBar添加导航tab主要有如下几步:

    1. 获得ActionBar对象,并设置ActionBar的导航模式为tabs模式;

    2. 创建需要显示在ActionBar上的tabs,并设置这些选项卡的title和icon,为tabs添加监听器;

    3. 通过ActionBar的addTab方法将tab添加到ActionBar上;

    首先,我创建了一个实现了ActionBar.TabListener接口的类,代码如下:

public class CustomTabListener<T extends Fragment> implements TabListener {
 private Fragment mFragment;
 private Activity mActivity;
 private Class<T> mClass;
 public CustomTabListener(Activity activity, Class<T> clz) {
  mActivity = activity;
  mClass = clz;
 }
 @Override
 public void onTabReselected(Tab tab, FragmentTransaction ft) {
 }
 @Override
 public void onTabSelected(Tab tab, FragmentTransaction ft) {
   Toast.makeText(mActivity, "Change tab", 3000).show();
 }
 @Override
 public void onTabUnselected(Tab tab, FragmentTransaction ft) {
  // ft.detach(mFragment);
 }
}

    然后在activity的onCreate方法中写了一个initView方法,方法内容为:

private void initView() {
  // 获得ActionBar
  ActionBar actionBar = getActionBar();
  // 设置导航模式为选项卡模式
  actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
  // 创建三个选项卡
  Tab nearTab = actionBar.newTab();
  Tab shakeTab = actionBar.newTab();
  Tab bootleTab = actionBar.newTab();
  // 为三个选项卡设置文本和icon
  nearTab.setText("Near").setIcon(R.drawable.near);
  shakeTab.setText("Shake").setIcon(R.drawable.shake);
  bootleTab.setText("Bootle").setIcon(R.drawable.bottle);
  // 为三个选项卡添加监听器
  nearTab.setTabListener(new CustomTabListener<NearFragment>(this,
    NearFragment.class));
  shakeTab.setTabListener(new CustomTabListener<ShakeFragment>(this,
    ShakeFragment.class));
  bootleTab.setTabListener(new CustomTabListener<BottleFragment>(this,
    BottleFragment.class));
  // 将三个选项卡添加到actionBar上
  actionBar.addTab(nearTab);
  actionBar.addTab(shakeTab);
  actionBar.addTab(bootleTab);
 }

    这样就成功地将tab添加到ActionBar上了,效果如下:

    

    点击某一个选项卡时,就会显示一次toast消息。

九、添加Action View

    ActionView是一种可以在ActionBar中替换Action按钮的控件,它可以允许用户在不切换界面的情况下通过ActionBar完成一些较为丰富的操作。比如说,你需要完成一个搜索功能,就可以将SeachView这个控件添加到ActionBar中。

    为了声明一个ActionView,我们可以在menu资源中通过actionViewClass属性来指定一个控件

<item
        android:id="@+id/action_search"
        android:actionViewClass="android.widget.SearchView"
        android:showAsAction="always"
        android:title="@string/action_alarm"/>

    然后按照上面添加Action Button的步骤进行便可以将Action View添加到ActionBar上,效果如下(图一和图二分别表示Action View收起和展开时的样子):

    可以为Action View添加响应事件,方法为重写onCreateOptionsMenu方法,在该方法中获得Action View对象,然后为该Action View对象添加OnActionExpandListener和onMenuItemActionCollapse监听器,这样当SearchView展开的时候就会回调onMenuItemActionExpand()方法,当SearchView合并的时候就会调用onMenuItemActionCollapse()方法,我们在这两个方法中进行相应的UI操作就可以了

    关于SearchView的更多详细用法,可以参考官方文档 http://developer.android.com/guide/topics/search/search-dialog.html

@Override
 public boolean onCreateOptionsMenu(Menu menu) {
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.menu_action_bar_02, menu);
  MenuItem searchItem = menu.findItem(R.id.action_search);
  // 为action view添加响应事件
  searchItem.setOnActionExpandListener(new OnActionExpandListener() {
   @Override
   public boolean onMenuItemActionExpand(MenuItem item) {
    Log.d(TAG, "on expand");
    Toast.makeText(getApplicationContext(), "expand",
      Toast.LENGTH_SHORT).show();
    return true;
   }
   @Override
   public boolean onMenuItemActionCollapse(MenuItem item) {
    Log.d(TAG, "on collapse");
    Toast.makeText(getApplicationContext(), "collapse",
      Toast.LENGTH_SHORT).show();
    return true;
   }
  });
  return super.onCreateOptionsMenu(menu);
 }

    十、overflow溢出菜单不显示

    问题:在有些机器上overflow溢出菜单并不会显示

     原因:Android系统默认首先会判断该机器是否有物理菜单键,如果有物理菜单键则不显示溢出菜单,将溢出菜单中的内容通过用户点击物理菜单键进行显示;如果没有物理菜单键则显示溢出菜单;

    解决办法:如果想要然所有的机器均能够显示溢出菜单,可以通过如下方法实现

     办法1定义如下方法,然后在需要显示溢出菜单的activityonCreate方法中调用该方法;

1.  <!--  强制显示overflow menu -->
2.  private void getOverflowMenu() {  
3.          try {  
4.              ViewConfiguration config = ViewConfiguration.get(this);  
5.              Field menuKeyField = ViewConfiguration.class 
6.                      .getDeclaredField("sHasPermanentMenuKey");  
7.              if (menuKeyField != null) {  
8.                  menuKeyField.setAccessible(true);  
9.                  menuKeyField.setBoolean(config, false);  
10.             }  
11.         } catch (Exception e) {  
12.             e.printStackTrace();  
13.         }  
14.     }

 

    办法2自定义一个Application如下,然后在AndroidManifest.xml中修改applicationandroid:name=".UIApplication"(注意路径)这样在该应用的所有activity中都会显示overflow menu菜单

    注:该方法只针对Android 4.0以上系统有效,其余系统可以使用PopupWindow实现类似功能

1.  public class UIApplication extends Applications{  
2.      public void onCreate() {        try {  
3.              ViewConfiguration config = ViewConfiguration.get(this);  
4.              Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");  
5.              if (menuKeyField != null) {  
6.                  menuKeyField.setAccessible(true);  
7.                  menuKeyField.setBoolean(config, false);  
8.              }  
9.          }  
10.         catch (Exception ex) {  
11.             // Ignore  
12.         }  
13.         super.onCreate();  
14.     }  
15. }

    原理:在ViewConfiguration这个类中有一个叫做sHasPermanentMenuKey的静态变量,系统就是根据这个变量的值来判断手机有没有物理Menu键的。因此我们可以通过修改该变量的值而使得系统认为此机器无物理菜单键,从而显示溢出菜单

十一、让overflow中的选项显示icon

    问题:overflow中的选项只显示title,而不会显式icon

     原因:这是Google官方的默认效果,Google认为隐藏在overflow中的Action按钮都应该只显示文字。

    解决办法:其实,overflow中的Action按钮应不应该显示图标,是由MenuBuilder这个类的setOptionalIconsVisible变量来决定的,如果我们在overflow被展开的时候将这个变量赋值为true,那么里面的每一个Action按钮对应的图标就都会显示出来了。

    代码如下:

 /**
  * 改变setOptionalIconsVisible的值,使得overflow能够显示icon
  */
 @Override
 public boolean onMenuOpened(int featureId, Menu menu) {
  if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {
   if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
    try {
     Method m = menu.getClass().getDeclaredMethod(
       "setOptionalIconsVisible", Boolean.TYPE);
     m.setAccessible(true);
     m.invoke(menu, true);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
  return super.onMenuOpened(featureId, menu);
 }

    效果如下:

    以上便是本人这两天根据官方training学习ActionBar,并参阅部分博客后写的学习笔记,如有不足/有误之处欢迎留言指出,谢谢!

© 著作权归作者所有

紫韵
粉丝 4
博文 21
码字总数 34323
作品 0
武汉
私信 提问
加载中

评论(1)

h
heart162
可以直接使用support包中TabLayout http://developer.android.com/intl/zh-cn/reference/android/support/design/widget/TabLayout.html
Android ActionBar Tabs学习笔记

本例主要实现用Tab切换不同的Fragment,点击View显示or隐藏ActionBar,把ActionBar 设为透明,使界面更加友好,详细代码见资源里的ActionBarTabs。 ActionBar Tab主要用于Fragment之间的切换...

鉴客
2011/12/16
11.2K
0
ActionTitleBar

对于android actionbar 的兼容实现,目前用得最多的就是ActionBarSherlock 那么为什么还要重复造一个轮子呢?在实际项目开发中,ActionBarSherlock 的实现无疑是目前最强大的actionbar 兼容实...

打杂程序猿
2013/05/26
6.6K
1
Holo风格的开源中国Android客户端——持续更新(2)

一、我的资料: 1、返回样式 2、编辑头像和刷新 3、截屏 4、执行耗时操作的提示方式 源代码采用的是创建一个LoadingDialog对象,在刷新、上传头像的时候,显示对话框,完成后消失。这个类似I...

Xushao
2013/06/25
0
8
Android ActionBar详解

关于ActionBar,相信大家并不陌生,但是真正能够熟练使用的也不是很多,这篇文章主要为大家详细介绍ActionBar的相关知识,ActionBar是在Android3.0中引入的概念,所以在2.x系统中使用ActionBar...

恰同学少年
2015/08/03
0
0
ActionBar自定义

自定义ActionBar样式 1、基于原有样式进行相关属性的修改,然后再AndroidManifest.xml对应android:theme中指定即可 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- the theme ap......

喜欢敲代码的感觉
2015/09/12
19
0

没有更多内容

加载失败,请刷新页面

加载更多

动态代理知识详解

动态代理实现的两种方式 给动态代理举个栗子:例如我们平时买笔记本电脑,很多时候都是不从厂家拿货,而是通过经销商买电脑。代理模式出现解决了生产厂家的一些问题,那么这个这个思想在我们...

我叫小糖主
26分钟前
5
0
Calendar TimeZone SimpleDateFormat

关于Calendar类的使用可参考:Java Calendar类的使用总结 获取日历(Calendar):java.util.Calendar#getInstance() 获取时区TimeZone: TimeZone.getTimeZone("GMT+00:00"); 或:TimeZone.ge......

Hzhodor
26分钟前
0
0
这 17 个 JVM 参数,高级 Java 必须掌握

前言 大家都知道,jvm在启动的时候,会执行默认的一些参数。一般情况下,这些设置的默认参数应对一些平常的项目也够用了。但是如果项目特别大了,需要增加一下堆内存的大小、或者是系统老是莫...

编程SHA
32分钟前
0
0
jenkins配置自动发送邮件

1.开通QQ的SMTP服务,需要发一条短信,qq会给你一个密码(不是你的QQ邮箱密码哦) 2.安装 Email Extension Plugin 插件 3.进入系统管理--系统设置 3.1按照如下图设置 首先找到 Extended E-m...

shzwork
36分钟前
0
0
网络请求异常拦截优化

目录介绍 01.网络请求异常分类 02.开发中注意问题 03.原始的处理方式 04.如何减少代码耦合性 05.异常统一处理步骤 06.完成版代码展示 好消息 博客笔记大汇总【16年3月到至今】,包括Java基础...

潇湘剑雨
41分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部