Android ActionBar使用教程

Android ActionBar使用教程,第1张

概述ActionBar的引入方式:有几种,从Android3.0(APIlever11)开始,所有使用Theme.Holo主题(或者它的子类)的Activity都包含了actionbar,当targetSdkVersion或minSdkVersion属性被设置成“11”或更大时,它是默认主题

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

总结

以上是内存溢出为你收集整理的Android ActionBar使用教程全部内容,希望文章能够帮你解决Android ActionBar使用教程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1149258.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存