Android ActionBar使用教程

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软件编程有所帮助。

(0)

相关推荐

  • Android自定义ActionBar实例

    本文实例讲述了Android自定义ActionBar的实现方法.分享给大家供大家参考.具体实现方法如下: Android 3.0及以上已经有了ActionBar的API,可以通过引入support package在3.0以下的平台引用这些API,但这儿呢,完全自定义一个ActionBar,不用引入额外jar包,参照的是开源的UI组件GreeenDroid,项目主页:https://github.com/cyrilmottier/GreenDroid .提取出关于ActionBar的相关文件,你可

  • Android编程之ActionBar Tabs用法实例分析

    本文实例讲述了Android编程之ActionBar Tabs用法.分享给大家供大家参考,具体如下: 这里主要实现用Tab切换不同的Fragment,点击View显示or隐藏ActionBar,把ActionBar 设为透明,使界面更加友好,详细代码见资源里的ActionBarTabs. ActionBar Tab主要用于Fragment之间的切换,其必须要设置ActionBar.TabListener,详细代码如下 ActionBarActivity.Java: import android.

  • android中开启actionbar的两种方法

    两种方法,第一种是静态开启方法 把application 或者 activity的主题设置为Theme.Holo即可 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.baidu.homer" android:versi

  • Android巧用ActionBar实现下拉式导航

    本文实例为大家分享了ActionBar下拉式导航的实现代码,供大家参考,具体内容如下 利用Actionbar同样可以很轻松的实现下拉式的导航方式,若想实现这种效果: 1)actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST)  2)setListNavigationCallbacks(SpinnerAdapter adapter,ActionBar.OnNavigationListener callback). 首先是创建一个Fra

  • Android ActionBarActivity设置全屏无标题实现方法总结

    Android  ActionBarActivity设置全屏无标题实现方法总结 前言: 新建的Activity继承自ActionBarActivity,设置全屏无标题本来很简单的事,但是没想到app竟然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时!!! 原因是ActionBarActivity设置theme的时候只能使用v7包里的Theme.AppCompat***开头的主题,因此设置全屏无标题的话需要自定义个style: <style name="ActionBarFu

  • Android ActionBar搜索功能用法详解

    本文实例讲述了Android ActionBar搜索功能用法.分享给大家供大家参考,具体如下: 使用ActionBar SearchView时的注意点: 首先要吐槽一下Android的官方Guide文档 ,关于用法讲得不明确,可能是一直没更新的原因吧. 本来照着文档搞了一下,hint死活出不来,也无法跳转到搜索结果Activity. StackOverflow也有人提出了这个问题,答案说得很明白 - 参考链接. 正确用法 1. 在AndroidManifest.xml中为提供SearchView

  • Android学习笔记之ActionBar Item用法分析

    本文实例讲述了Android ActionBar Item用法.分享给大家供大家参考,具体如下: 这里主要讲述ActionBar Item的使用方法.在手机上,按Menu键出现Menu菜单,但是在平板中可以把菜单放在ActionBar里面,放置的Item也比手机上多,下面详细介绍其用法: 1.在Androidmanifest.xml里面加上 <uses-sdk Android:minSdkVersion="11"/> 或者 <uses-sdk android:targ

  • Android巧用ActionBar实现tab导航效果

    本文实例为大家分享了ActionBar实现tab导航效果的具体代码,供大家参考,具体内容如下 先来说一说基础知识: 一.基本使用方法 1.获取ActionBar 获取actionbar很简单,在activity中,ationbar=this.getActionBar(); 2.显示/隐藏 设置actionBar的显示/隐藏,可以使用show()和hide()方法. 3.设置MenuItem 通过设置menuItem,可以使menuItem成为actionbar上的item. setShowAsA

  • Android 活动条ActionBar的详解及实例代码

    Android 活动条ActionBar的详解 图一 图二 图三 图四 图五 ActionBar其提供的功能总结 图一使用ActionBar显示选项菜单项 menu_mainxml代码 启用程序图标导航 如何添加Action View 图二Activity代码区 menu_mainxml代码 clockxml 图三使用ActionBar实现Tab导航 创建ActionBar实现Tab导航步骤 MainActivity代码 DummyFragmentjava代码 图四Android 30之前的Fr

  • Android中ActionBar以及menu的代码设置样式

    menu部分xml代码 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_search" android:title="搜索1" android:orderI

  • Android编程实现ActionBar的home图标动画切换效果

    本文实例讲述了Android编程实现ActionBar的home图标动画切换效果.分享给大家供大家参考,具体如下: Material Design中一个重要特性是侧滑菜单 展开/关闭 时,ActionBar上的home图标也动画切换.本例要实现的正是这个效果,如图所示: 实现这个效果仅需几步: 1.首先,该页面的布局是一个DrawerLayout,代码如下: <android.support.v4.widget.DrawerLayout xmlns:android="http://sche

  • 灵活使用Android中ActionBar和ViewPager切换页面

    本文实例讲述了Android使用ActionBar和ViewPager切换页面,分享给大家供大家参考.具体如下: 运行效果截图如下: 项目布局如下: 具体代码如下: MainActivity.java代码 import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.

随机推荐