android ActionBar详解

转自: 不知道转自哪里了,综合多家精粹而成,写下来给自己复习用。

android ActionBar学习:

 

1.    ActionBar是一个显示在屏幕顶部的控件(A所示),它包括了在上边(如B所示)显示的应用图标,应用标题(如1所示)以及右边的操作菜单(如3,4,5)。还包括了用于多个Fragment之间的标签导航(如C所示)。

2.    我们可以选择可见的操作菜单可见项(如3,4),不可见项(如5)会以下拉列表的形式呈现出来。(点击5会出现下拉列表,显示没有直接显示出来的操作菜单可见项)

3.    ActionBarFragment之间提供标签导航(如C所示)


ActionBar是android3.0之后出现的,所以在项目中如果声明andr:minSdkVersion或者android:targetSdkVersion属性被设置成11或更高时,应用会被认为是android3.0版本(android3.0的默认主题”holographic”已经创造了actionbar),默认含有ActionBar.但如果为了实现2.X版本的应用使用ActionBar,我们可以引入android.support.v7 这个包里面的一个工程,把它作为library引入,这样我们就可以毫不费力的实现在android2.x版本中使用actionBar。在android.support.v7没有出来之前,人们一直使用的是某大牛自己编写的第三方库,也能很好的兼容2.x版本,这个第三方库就是AcitonBarSherlock,位于GitHub上面的https://github.com/johannilsson/android-actionbar,大家有机会可以熟悉熟悉。我们接下来主要说说support-v7。

 

打开android SDK Manager

然后下载下面两项,support-v4support-v7 support-v13都在下载的文件夹下

 

下载完成之后打开sdk所在目录如下:


其中v7下的结构如下图所示:


接下来要做的就是导入appcompat这个项目到eclipse中作为一个library(记得导入的时候一定勾选copy program intoworkspace),然后让自己的项目引用它。

具体过程如图:

   

导入之后,再新建自己的项目,然后在自己的项目中引入上面的support-v7项目,具体操作如图:


至此,我们的support-v7就成功引入了,接下来我们将具体在代码中实现actionbar的使用。

 

新建一个activity,它需要继承ActionBarActivity然后在manifest.xml文件中为该activity设置theme

<activity

           android:name="com.hospital.actionbar.ActionBarDemo1"

           android:label="@string/app_name"

           android:theme="@style/Theme.AppCompat.Light">

       </activity>

如果不设置主题的话会报如下错误:

05-16 15:28:15.836: E/AndroidRuntime(24933):Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompattheme (or descendant) with this activity.

设置好之后我们就可以在代码中获取到ActionBar:

ActionBar bar = getSupportActionBar();//2.1以上的工程用这个方法获取对actionbar的引用,并且向上兼容  

//   ActionBar bar = getActionBar();//3.0以上的工程,可以用这个方法获取  

  

bar.hide();//你可以通过这两个方法,来控制actionBar的显示状态,隐藏actionbar

bar.show();  //显示actionbar

bar.setDisplayHomeAsUpEnabled(true);// 给左上角图标的左边加上一个返回的图标,并决定是否可以点击。

bar.setHomeButtonEnabled(true);//设置actionBar homebutton是否可点击,小于4.0版本的默认值为true的。但是在4.0及其以上是false

bar.setIcon(R.drawable.ic_back);//设置actionbar homebutton图标

bar.setDisplayShowHomeEnabled(false);//使左上角图标是否显示,如果设成false,则没有程序图标,仅仅就个标题,否则,显示应用程序图标

bar.setCustomView(view);//actionbar设置自定义view,该view显不显示由setDisplayShowCustomEnabled决定

bar.setDisplayShowTitleEnabled(false);//是否显示标题

bar.setDisplayShowCustomEnabled(true);//使自定义的普通View能在title栏显示,即actionBar.setCustomView能起作用

为ActionBar添加子元素。

添加子元素有两种方式,1.静态加载xml文件; 2.在代码中动态添加子元素

方式1.

res/menu文件夹下建立一个文件activity_myactionbar.xml,内容如下:

<menu xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:hahaha="http://schemas.android.com/apk/res-auto" >

   <!-- 一定要添加上面一行的自定义命名空间,不然就无法通过XML文件实现ActionItem的功能 --> 

   <!-- 而且需要特别注意上面自定义的命名空间的后缀一定要和item   hahaha:showAsAction的前缀一致,不然同样是看不到效果的 --> 

 

   <item

       android:id="@+id/item1"

       android:orderInCategory="1"

       hahaha:showAsAction="ifRoom|withText"

       android:icon="@drawable/icon_me_common"

       android:title="A"/>

   <item

       android:id="@+id/item2"

        android:orderInCategory="2"

       hahaha:showAsAction="ifRoom|withText"

       android:icon="@drawable/icon_me_common"

       android:title="B"/>

   <item

       android:id="@+id/item3"

       android:orderInCategory="3"

       hahaha:showAsAction="ifRoom|withText"

       android:icon="@drawable/icon_me_common"

       android:title="C"/>

   <item

       android:id="@+id/item4"

       android:orderInCategory="5"

       hahaha:showAsAction="ifRoom|withText"

       android:icon="@drawable/icon_me_common"

       android:title="D"/>

   </menu>

解释下上面的各种属性所表达的意思以及要注意的位置:

1.       如上图,一定要在行首生命一个自定义的命名空间:

xmlns:hahaha=http://schemas.android.com/apk/res-auto

在赋值showAsAction属性时就会用到这个命名空间,之所以要这样,是因为如果你是用V7这个支持库来实现的actionbar,而且你的手机是带有menu键的老手机,那么它的framework层是不支持android:showAsAction这个属性的。所以你需要为刚才menu的xml文件,署名一个命名空间。

2.       android:orderInCategory:表示在actionBar上面排列的先后顺序,值越大越靠后,不设置则系统默认。

3.       showAsAction的值可取:

1always:这个值会使菜单项一直显示在Action Bar上。
2ifRoom:如果有足够的空间,这个值会使菜单项显示在Action Bar上。
3never:这个值使菜单项永远都不出现在Action Bar,只会出现在溢出菜单上。
4withText:这个值使菜单项和它的图标,菜单文本一起显示

5、collapseActionView:它一般和hahaha:actionViewClass或hahaha:actionLayout  一起使用,表示将item引用的布局隐藏起来,当你点击该item的时候,再将其展现出来。通过这个属性,我们就可以将每个item复杂的布局隐藏起来,从而有效的节约了actionbar的布局空间。

activity_myactionbar.xml文件创建之后,我们在activity中重写父类的onCreateOptionsMenu方法:

@Override

publicboolean onCreateOptionsMenu(Menu menu) {

           //TODO Auto-generated method stub

           super.onCreateOptionsMenu(menu);

           this.getMenuInflater().inflate(R.menu.activity_myactionbar,menu);

           returntrue;

}

这样就实现了actionbar子元素的加载。响应子元素的点击事件则需要重写父类的onOptionsItemSelected方法,要注意,在actionbar中有一个button的id为android.R.id.home,这个控件就是actionbar上面的1所示的图标:

@Override

publicboolean onOptionsItemSelected(MenuItem item) {

           super.onOptionsItemSelected(item);

           switch(item.getItemId()) {

           caseR.id.item1:

                    Util.showMessageWithToast(getApplicationContext(),"item1");

                    break;

           caseR.id.item2:

                    Util.showMessageWithToast(getApplicationContext(),"item2");

                    break;

           caseandroid.R.id.home:

                    Util.showMessageWithToast(getApplicationContext(),"home");

                    break;

           default:

                    break;

           }

           returntrue;

}

方式2:与方式1相比,只是重写的方法有所区别:

@Override

    publicboolean onCreateOptionsMenu(Menu menu) {

        //Inflate the menu; this adds items to the action bar if it is present.

       super.onCreateOptionsMenu(menu);

       //添加菜单项

       MenuItem add=menu.add(0,0,0,"add");

       MenuItem del=menu.add(0,0,0,"del");

       MenuItem save=menu.add(0,0,0,"save");

        //绑定到ActionBar 

       add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

       del.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

       save.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

       return true;

}

将actionItem显示在屏幕底部

为了尽可能的多显示menuitem,ActionBar提供了将item显示在底部的功能,实现方式很简单,只需要在声明的activity处加上如下属性uiOptions和 meta-data:

 

 

 

 

 

为ActionBar添加Action View

 

 

如上图所示,点击一个action item之后,actionBar布局发生了变化,这个就是我们所谓的action view,先看看我们的布局文件:

<menu xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:hahaha="http://schemas.android.com/apk/res-auto" >

 

   <!-- 一定要添加上面一行的自定义命名空间,不然就无法通过XML文件实现Action Item的功能 -->

   <!-- 而且需要特别注意上面自定义的命名空间的后缀一定要和item里   hahaha:showAsAction 的前缀一致,不然同样是看不到效果的 –->

    <item

       android:id="@+id/item4"

       android:icon="@drawable/icon_guahao_select"

       android:orderInCategory="5"

       android:title="D"

       hahaha:showAsAction="ifRoom|withText"/>

   <item

       android:id="@+id/item5"

       android:icon="@drawable/icon_paihao_select"

       android:orderInCategory="4"

       android:title="E"

       hahaha:showAsAction="ifRoom|withText"/>

   <item

       android:id="@+id/item6"

       android:icon="@drawable/icon_me_common"

       android:orderInCategory="6"

       android:title="F"

       hahaha:actionLayout="@layout/activity_myactionbar_item"

       hahaha:showAsAction="ifRoom|collapseActionView"/>

</menu>

主要看item6,里面有一个actionLayout的属性,这个是指,当item6被点击时,ActionBar所要加载的view。

showAsAction属性下的collapseActionView表示将item引用的布局隐藏起来,当你点击该item的时候,再将其展现出来。

添加的Action View我们又如何获取该view的点击事件呢,下面的代码(case item6处)将展示如何做到,MenuItemCompat.setOnActionExpandListener监听action view展开或关闭事件 :

@Override

         publicboolean onOptionsItemSelected(MenuItem item) {

                   super.onOptionsItemSelected(item);

                   MenuItemCompat.setOnActionExpandListener(item,

                                     newOnActionExpandListener() {

                                               @Override

                                               publicboolean onMenuItemActionCollapse(MenuItem item) {

                                                        Util.showMessageWithToast(getApplicationContext(),

                                                                           "actionview hide");

                                                        returntrue;

                                               }

 

                                               @Override

                                               publicboolean onMenuItemActionExpand(MenuItem item) {

                                                        Util.showMessageWithToast(getApplicationContext(),

                                                                           "actionview open");

                                                        returntrue;

                                               }

                                     });

 

 

                   switch(item.getItemId()) {

                                     caseR.id.item5:

                            Util.showMessageWithToast(getApplicationContext(),"item5");

                            break;

                   caseR.id.item6:

                            Util.showMessageWithToast(getApplicationContext(),"item6");

 

                            Viewview = MenuItemCompat.getActionView(item);//获取itme6包含的View

 

                            //对于API 11 以及以上的版本,获取ActionView直接调用以下代码即可

                            //View view = item.getActionView();

 

                            Buttonbtn1 = (Button) view.findViewById(R.id.button1);

                            btn1.setOnClickListener(newOnClickListener() {

 

                                     @Override

                                     publicvoid onClick(View v) {

                                              Util.showMessageWithToast(getApplicationContext(),

                                                                 "actionview clicked");

                                     }

                            });

 

                            break;

                   caseandroid.R.id.home:

                            Util.showMessageWithToast(getApplicationContext(),"home");

                            break;

                   default:

                            break;

                   }

                   returntrue;

         }

 

 添加Navigation Tabs

在actionbar中添加导航栏也是一项很通用的ui,actionbar也作出了很好的实现。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值