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中。 以上内容来自: http://shikezhi.com/html/2015/android_1205/688190.html
为了在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 的最佳实践 - 安卓 - 伯乐在线 http://android.jobbole.com/83105/

设置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菜单:

取消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>                           

设置Menu菜单的背景色:

也是在Activity的主题中进行设置
                                            <!--s设置Menu菜单的背景色-->                                  <item name="android:itemBackground">@color/black_light</item>                      

自定义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"这个属性,还可以监听收起/展开事件:在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);                      
此处参考文档: Action Views and Action Providers | Android Developers http://developer.android.com/training/appbar/action-views.html

更多相关文章

  1. AndroidLinearLayout:添加阴影边界LinearLayout - Android(安卓)
  2. Android用户界面 UI组件--TextView及其子类(五) DigitalClock,An
  3. android在程序中打开另一个程序
  4. Android(安卓)webview最简单小例子
  5. 在Android(安卓)Studio中使用Android-PullToRefresh Library
  6. android 简单试题系统
  7. android 的webView的透明设置
  8. Android中popuwindow中使用listview

随机推荐

  1. 在Ubuntu中和Android中添加开机自启动的
  2. Android(安卓)RadioButton设置选中时文字
  3. 【Android】ViewPager实现图片左右滑动播
  4. Android(安卓)studio使用技巧(二:国际化以
  5. Android获取屏幕分辨率及DisplayMetrics
  6. Android(安卓)中自定义属性(attr.xml,Typ
  7. Android程序开发初级教程
  8. android 基础知识
  9. Android(安卓)NDK编程中Application.mk和
  10. Ubuntu Linux下android源码下载方法