欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android ActionBar使用教程

程序员文章站 2024-03-01 09:06:10
actionbar的引入方式: 有几种,从 android 3.0(api lever 11) 开始,所有使用 theme.holo 主题(或者它的子类)的 acti...

actionbar的引入方式:

有几种,从 android 3.0(api lever 11) 开始,所有使用 theme.holo 主题(或者它的子类)的 activity 都包含了 action bar,当 targetsdkversion 或 minsdkversion 属性被设置成 “11” 或更大时,它是默认主题。为了兼容android3.0之前的低版本,actionbar通常通过extends集成support包下的appcompatactivity实现,同时需要使用theme.appcompat的actionbar主题(想要去掉actionbar使用theme.appcompat.noactionbar主题或者theme.holo.noactionbar主题即可)。
注:如果你想使用setsupportactionbar()方法的方式添加actionbar,那么同时你想使用actionbar的主题,那么就必须设置去除主题中的actionbar,<item name="windowactionbar">false</item>,二者只能保留其一。否则会报错:
java.lang.illegalstateexception: this activity already has an action bar supplied by the window decor. do not request window.feature_support_action_bar and set windowactionbar to false in your theme to use a toolbar instead.

        toolbar toolbar = (toolbar) findviewbyid(r.id.toolbar);
        setsupportactionbar(toolbar);
就算设置<item name="windowactionbar">false</item>,只要使用的是actionbar的主题,actionbar依然存在,原因暂时不知

v4包和v7包
v4包是为android 1.6(api level  4)及以上的版本设计的,它包含大部分高版本中有而低版本中没有的api,包括application components、user interface features、accessibility、data handling、network connectivity、and programming utilities,提供对fragment、viewpager等android3.0之后的高版本特性的兼容:
fragment:通过它可以让同一个程序适配不同的屏幕。
notificationcompat:支持更丰富的通知形式;
localbroadcastmanager: 用来在同一个应用内的不同组件间发送broadcast。

v7包是android 2.1(api level 7)及以上的版本谷歌提供了一系列的support包
 这个库添加 action bar 用户界面设计模式的支持。这个库包括支持material design的用户界面实现。
注意:这个库依赖于v4 support library。
这里有一些包含在v7 appcompat库中的关键类:
actionbar:提供actionbar用户界面模式的实现
appcompatactivity :增加一个activity类,可以用作支持actionbar实现的activity的基类。
appcompatdialog :添加一个对话框类,可以作为一个appcompat主题对话框基类。
shareactionprovider :增加一个标准化的共享动作(如电子邮件或发送到社交网站),包含在actionbar中。

为了在3.0之前的版本中使用fragment我们要继承support v4包下的fragmentactivity,如果想在3.0之前的版本使用actionbar就需要继承support v7包下的actionbaractivity,使用theme.holo系列主题,actionbaractivity是继承自fragmentactivity的。android5.0之后v7包更新,使用actionbar可以继承v7包中的appcompatactivity,同时提供了一系列新的actionbar的主题(theme.appcompat )
1.添加左侧返回按钮:
在清单文件 中为activity添加上级activity:android:parentactivityname=".activity.imageshowactivity"
同时调用actionbar的setdisplayhomeasupenabled(true)方法设置左上角返回图标,默认是左箭头

getsupportactionbar().setdisplayhomeasupenabled(true);
  // 如果你的minsdkversion属性是11或更高, 应该这么用:
  // getactionbar().setdisplayhomeasupenabled(true);

注:如果你的编译版本compilesdkversion 23高于android5.0(api level 21),只用在manifest文件中声明父级activity即可。比21更低版本未测试。同时如果主动设置了getactionbar().setdisplayhomeasupenabled(false);则一定会取消返回按钮

注:回退activity的一个技巧:itent对象中包括flag_activity_clear_top标识。用这个标记,如果你要启动的activity在当前任务中已经存在,那么,堆栈中这个activity之上的所有的activity都有被销毁,并且把这个activity显示给用户。
注:这种返回不会保留之前activity中的数据,也不能使用onsaveinstance() 方法保存
这时候需要进行特殊处理,在复写的onoptionsitemselected方法中,判断当前activity和目标父级activity实例是否在同一个任务栈,在同一个任务栈就清空目标父级activity实例之上的实例,并在同一个任务栈启动目标父级实例。否则新建一个任务栈启动。这么处理的初衷是这里的向上导航是与回退简单finish掉实例相区别的,这里希望跨越式的回到主activity。

 @override
  public boolean onoptionsitemselected(menuitem item) {
    switch (item.getitemid()) {
      case android.r.id.home:
        toastutils.show(this, "home");
        intent upintent = navutils.getparentactivityintent(this);
        //判断当前activity在向上导航到目标intent upintent是否需要重建新的任务栈,
        if (navutils.shoulduprecreatetask(this, upintent)) {
          //重建新的任务栈
          taskstackbuilder.create(this)
              .addnextintentwithparentstack(upintent)
              .startactivities();
        } else {
          //使用当前任务栈
          upintent.addflags(intent.flag_activity_clear_top);//清空任务栈中目标activity实例之上的所有实例
          navutils.navigateupto(this, upintent);//直接在同一个任务栈跳转
        }
        return true;//消费掉事件
    }
    return super.onoptionsitemselected(item);
  }

自定义home:
同时取消显示左上角返回按钮

 /*设置左上角logo icon*/
    actionbar.setlogo(r.drawable.go_back_64px);//(单独设置没作用)
    actionbar.setdisplayshowhomeenabled(true);//是否显示logo,必须为他setlogo()才起作用
    actionbar.setdisplayuselogoenabled(true);//是否使用activity的logo,即setlogo()方法设置的logo
 
    actionbar.setdisplayhomeasupenabled(false);//是否显示左上角默认的返回按钮
    actionbar.sethomebuttonenabled(false);//按钮是否可以点击(实测无用,false下依然可以点击--已经设置了该activity的父级activity)

设置标题的颜色:
根据测试直接在activity的主题中或者actionbar的主题中进行设置是不生效的。可以通过为activity或者actionbar主题设置titletextstyle属性,添加文字的主题风格,该风格需要继承自@android:style/textappearance:

<!--设置标题的颜色,注意使用兼容包下的属性-->
    <item name="android:titletextstyle">@style/mytheme.actionbar.titletextstyle</item>
    <item name="titletextstyle">@style/mytheme.actionbar.titletextstyle</item>
 <style name="mytheme.actionbar.titletextstyle" parent="@android:style/textappearance.holo.widget.actionbar.title">
    <item name="android:textcolor">@color/blue</item>
    <item name="android:textsize">16sp</item>
  </style>

注意若是使用了support中的actionbar就需要使用属性titletextstyle而不是android:titletextstyle,否则设置的颜色也不会生效。
设置actionbar浮动:
做法是:在不要显示actionbar的时候使用hide()方法隐藏
重写activity的ontouchevent()方法:

 @override
  public boolean ontouchevent(motionevent event) {
    log.d("debug", "ontouchevent");
    if (actionbar == null) {
      actionbar = getsupportactionbar();
    }
    switch (event.getaction()) {
      case motionevent.action_up:
//        if (actionbar != null) {
        if (actionbar.isshowing()) {
          //隐藏
          actionbar.hide();
        } else {
          //显示
          actionbar.show();
        }
//        }
        break;
    }
    return super.ontouchevent(event);
  }

设置actionbar隐藏时不重绘activity的布局:
在 action bar 隐藏和显示过程中调整布局的大小,很影响视觉体验。
需要api  level 19 及之上:设置内容填充系统状态栏,不存在重新布局的问题了

复制代码 代码如下:
getwindow().setflags(windowmanager.layoutparams.flag_translucent_status, windowmanager.layoutparams.flag_translucent_status);

或者为activity主题添加属性:
<item name="android:windowtranslucentstatus">true</item>
官方文档给出的方法是:设置叠加模式,不限版本

 <item name="android:windowactionbaroverlay">true</item>
    <!-- 兼容支持库 -->
    <item name="windowactionbaroverlay">true</item>

设置系统状态栏
在android4.4之前,在app的上方总是保留着黑乎乎的系统状态栏,在4.4之后引入了透明状态栏效果(translucent system bar),使app可以使用全部屏幕 ,同时使系统状态栏和导航栏半透明
在activity的主题中

 <item name="android:windowtranslucentstatus">true</item>
    <item name="android:windowtranslucentnavigation">true</item>
//除此之外还可以设置系统状态栏的颜色:适用于页面是单纯颜色:
<item name="android:windowtranslucentstatus">false</item>
    <item name="android:windowtranslucentnavigation">true</item>
    <item name="android:statusbarcolor">@android:color/transparent</item>

此处参考:translucent system bar 的最佳实践 - 安卓 - 伯乐在线

设置menu菜单不遮挡acionbar:
使用support v7包下的actionbar,默认menu菜单会顶到屏幕的顶部,遮挡到actionbar,想要的效果是menu位于actionbar的下面。
在activity的主题中添加属性:actionoverflowmenustyle

<!--设置menu菜单不遮挡actionbar-->
    <item name="actionoverflowmenustyle">@style/overflowmenu</item>
//创建这个主题,继承自主题widget.appcompat.popupmenu
 <style name="overflowmenu" parent="widget.appcompat.popupmenu.overflow">
    <!--兼容api 21之前的版本 -->
    <item name="overlapanchor">true</item>
 
    <!-- api 21-->
    <!--<item name="android:overlapanchor">false</item>-->
  </style>

消除左侧按钮的遗留空白:
设置不显示左上角返回按钮之后,它左边的空白仍然在显示。

设置menu菜单:
1、取消menu菜单:
在复写的oncreateoptionsmenu方法返回false即可,或者不复写该方法。
设置menu菜单按钮的颜色:
注意设置activity的主题而不是actionbar的主题:

 <!--设置menu的文字颜色-->
    <!--<item name="actionmenutextcolor">@color/yellow</item>-->
    <!--<item name="android:actionmenutextcolor">@color/yellow</item>-->
    <!--上面两个设置是无效的-->
    <item name="android:itemtextappearance">@style/mycustommenutextapearance</item>
 <style name="mycustommenutextapearance" parent="@android:style/textappearance.widget.iconmenu.item">
    <!--文字颜色-->
    <item name="android:textcolor">@color/blue</item>
    <!--文字大小-->
    <item name="android:textsize">16sp</item>
  </style>

2、设置menu菜单的背景色:
也是在activity的主题中进行设置

 <!--s设置menu菜单的背景色-->
    <item name="android:itembackground">@color/black_light</item>

3、自定义menu菜单项:
除了使用系统给定的action,还可以自定义,这是需要使用action view and action provider,个人理解是可以提供视觉效果和交互功能的menu item。
同样是在menu中定义item,需要使用actionviewclass和actionlayout中的一个,其中actionviewclass 指定使用的控件类名,如搜索控件searchview,actionlayout指定自己定义的布局文件作为action的视图。
actionviewclass: the class of a widget that implements the action.
actionlayout: a layout resource describing the action's components.

1).使用actionviewclass添加一个系统搜索item:
添加item:

<item android:id="@+id/action_search"
   android:title="@string/action_search"
   android:icon="@drawable/ic_search"
   app:showasaction="ifroom|collapseactionview"
   app:actionviewclass="android.support.v7.widget.searchview" />

处理搜索事件:通过menu的finditem()方法拿到控件的引用,绑定文本查询的监听器

 @override
  public boolean oncreateoptionsmenu(menu menu) {
    // inflate the menu; this adds items to the action bar if it is present.
    getmenuinflater().inflate(r.menu.menu_main, menu);
    //找到actionbar上所添加的ui组件的方法:
    msearchview = (searchview) menu.finditem(r.id.searchitem).getactionview();
    msearchview.setonquerytextlistener(new searchview.onquerytextlistener() {
      @override
      public boolean onquerytextsubmit(string string) {
        toast.maketext(showimageactivity.this, "查询:" + string, toast.length_short).show();
        return false;
      }
 
      @override
      public boolean onquerytextchange(string string) {
        return true;
      }
    });
}

上面为item设置了app:showasaction="ifroom|collapseactionview"属性,其中collapseactionview含义是没有交互动作时(未点击时)搜索item收起只显示icon,有交互时,item展开充满actionbar剩余空间。搭配ifroom表示有空间时展示到app bar上,没空间时作为menu item.never表示一直作为menu item。always表示一直展示在app bar上。

2).使用actionlayout添加一个自定义的搜索控件
添加item

<item
    android:id="@+id/custom_search"
    android:icon="@drawable/ic_action_search"
    android:title="custom_search"
    app:actionlayout="@layout/search_layout"
    app:showasaction="collapseactionview|always|withtext" />

布局文件:search_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="200dp"
  android:layout_height="wrap_content"
  android:gravity="center_vertical"
  android:orientation="horizontal"
  android:padding="5dp">
 
  <imageview
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:src="@drawable/ic_action_search" />
 
  <edittext
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />
</linearlayout>

同时如果设置了app:showasaction="collapseactionview"这个属性,还可以监听shouqi/展开事件:在oncreateoptionsmenu(menu menu)方法中 

menuitem collapseactionview = menu.finditem(r.id.searchitem);
    // define the listener
    menuitemcompat.onactionexpandlistener expandlistener = new menuitemcompat.onactionexpandlistener() {
      @override
      public boolean onmenuitemactioncollapse(menuitem item) {
        // do something when action item collapses
        toastutils.show(showimageactivity.this, "action item collapses");
        return true; // return true to collapse action view
 
      }
 
      @override
      public boolean onmenuitemactionexpand(menuitem item) {
        // do something when expanded
        toastutils.show(showimageactivity.this, "action item expanded");
        return true; // return true to expand action view
      }
    };
    menuitemcompat.setonactionexpandlistener(collapseactionview, expandlistener);

以上就是android actionbar使用教程,希望对大家学习android软件编程有所帮助。