转自: 不知道转自哪里了,综合多家精粹而成,写下来给自己复习用。
android ActionBar学习:
1. ActionBar是一个显示在屏幕顶部的控件(如A所示),它包括了在上边(如B所示)显示的应用图标,应用标题(如1所示)以及右边的操作菜单(如3,4,5)。还包括了用于多个Fragment之间的标签导航(如C所示)。
2. 我们可以选择可见的操作菜单可见项(如3,4),不可见项(如5)会以下拉列表的形式呈现出来。(点击5会出现下拉列表,显示没有直接显示出来的操作菜单可见项)
3. ActionBar为Fragment之间提供标签导航(如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-v4,support-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的值可取:
1、always:这个值会使菜单项一直显示在Action Bar上。
2、ifRoom:如果有足够的空间,这个值会使菜单项显示在Action Bar上。
3、never:这个值使菜单项永远都不出现在Action Bar上,只会出现在溢出菜单上。
4、withText:这个值使菜单项和它的图标,菜单文本一起显示
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也作出了很好的实现。