Android ActionBar使用教程
ActionBar的引入方式:
有几种,从Android3.0(APIlever11)开始,所有使用Theme.Holo主题(或者它的子类)的Activity都包含了actionbar,当targetSdkVersion或minSdkVersion属性被设置成“11”或更大时,它是默认主题。为了兼容Android3.0之前的低版本,actionbar通常通过extends集成Support包下的AppCompatActivity实现,同时需要使用Theme.AppCompat的ActionBar主题(想要去掉ActionBar使用Theme.AppCompat.NoActionBar主题或者Theme.Holo.NoActionBar主题即可)。
注:如果你想使用setSupportActionBar()方法的方式添加ActionBar,那么同时你想使用ActionBar的主题,那么就必须设置去除主题中的Actionbar,<itemname="windowActionBar">false</item>,二者只能保留其一。否则会报错:
java.lang.IllegalStateException:ThisActivityalreadyhasanactionbarsuppliedbythewindowdecor.DonotrequestWindow.FEATURE_SUPPORT_ACTION_BARandsetwindowActionBartofalseinyourthemetouseaToolbarinstead.
Toolbartoolbar=(Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
注:就算设置<itemname="windowActionBar">false</item>,只要使用的是ActionBar的主题,ActionBar依然存在,原因暂时不知
V4包和V7包
V4包是为Android1.6(APILevel 4)及以上的版本设计的,它包含大部分高版本中有而低版本中没有的API,包括applicationcomponents、userinterfacefeatures、accessibility、datahandling、networkconnectivity、andprogrammingutilities,提供对Fragment、ViewPager等Android3.0之后的高版本特性的兼容:
Fragment:通过它可以让同一个程序适配不同的屏幕。
NotificationCompat:支持更丰富的通知形式;
LocalBroadcastManager:用来在同一个应用内的不同组件间发送Broadcast。
V7包是Android2.1(APILevel7)及以上的版本谷歌提供了一系列的support包
这个库添加ActionBar用户界面设计模式的支持。这个库包括支持materialdesign的用户界面实现。
注意:这个库依赖于v4SupportLibrary。
这里有一些包含在v7appcompat库中的关键类:
ActionBar:提供ActionBar用户界面模式的实现
AppCompatActivity:增加一个Activity类,可以用作支持ActionBar实现的Activity的基类。
AppCompatDialog:添加一个对话框类,可以作为一个appcompat主题对话框基类。
ShareActionProvider:增加一个标准化的共享动作(如电子邮件或发送到社交网站),包含在ActionBar中。
为了在3.0之前的版本中使用Fragment我们要继承Supportv4包下的FragmentActivity,如果想在3.0之前的版本使用ActionBar就需要继承SupportV7包下的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);
注:如果你的编译版本compileSdkVersion23高于Android5.0(APIlevel21),只用在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 publicbooleanonOptionsItemSelected(MenuItemitem){ switch(item.getItemId()){ caseandroid.R.id.home: ToastUtils.show(this,"home"); IntentupIntent=NavUtils.getParentActivityIntent(this); //判断当前Activity在向上导航到目标IntentupIntent是否需要重建新的任务栈, if(NavUtils.shouldUpRecreateTask(this,upIntent)){ //重建新的任务栈 TaskStackBuilder.create(this) .addNextIntentWithParentStack(upIntent) .startActivities(); }else{ //使用当前任务栈 upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//清空任务栈中目标Activity实例之上的所有实例 NavUtils.navigateUpTo(this,upIntent);//直接在同一个任务栈跳转 } returntrue;//消费掉事件 } returnsuper.onOptionsItemSelected(item); }
自定义Home:
同时取消显示左上角返回按钮
/*设置左上角LogoIcon*/ 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:
<!--设置标题的颜色,注意使用兼容包下的属性--> <itemname="android:titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item> <itemname="titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item> <stylename="MyTheme.ActionBar.TitleTextStyle"parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title"> <itemname="android:textColor">@color/blue</item> <itemname="android:textSize">16sp</item> </style>
注意若是使用了Support中的ActionBar就需要使用属性titleTextStyle而不是android:titleTextStyle,否则设置的颜色也不会生效。
设置Actionbar浮动:
做法是:在不要显示ActionBar的时候使用hide()方法隐藏
重写Activity的onTouchEvent()方法:
@Override publicbooleanonTouchEvent(MotionEventevent){ Log.d("debug","onTouchEvent"); if(actionBar==null){ actionBar=getSupportActionBar(); } switch(event.getAction()){ caseMotionEvent.ACTION_UP: //if(actionBar!=null){ if(actionBar.isShowing()){ //隐藏 actionBar.hide(); }else{ //显示 actionBar.show(); } //} break; } returnsuper.onTouchEvent(event); }
设置Actionbar隐藏时不重绘Activity的布局:
在actionbar隐藏和显示过程中调整布局的大小,很影响视觉体验。
需要APi level19及之上:设置内容填充系统状态栏,不存在重新布局的问题了
getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
或者为Activity主题添加属性:
<itemname="android:windowTranslucentStatus">true</item>
官方文档给出的方法是:设置叠加模式,不限版本
<itemname="android:windowActionBarOverlay">true</item> <!--兼容支持库--> <itemname="windowActionBarOverlay">true</item>
设置系统状态栏
在android4.4之前,在App的上方总是保留着黑乎乎的系统状态栏,在4.4之后引入了透明状态栏效果(TranslucentSystemBar),使App可以使用全部屏幕,同时使系统状态栏和导航栏半透明
在Activity的主题中
<itemname="android:windowTranslucentStatus">true</item> <itemname="android:windowTranslucentNavigation">true</item> //除此之外还可以设置系统状态栏的颜色:适用于页面是单纯颜色: <itemname="android:windowTranslucentStatus">false</item> <itemname="android:windowTranslucentNavigation">true</item> <itemname="android:statusBarColor">@android:color/transparent</item>
此处参考:TranslucentSystemBar的最佳实践-安卓-伯乐在线
设置Menu菜单不遮挡AcionBar:
使用SupportV7包下的ActionBar,默认Menu菜单会顶到屏幕的顶部,遮挡到Actionbar,想要的效果是Menu位于ActionBar的下面。
在Activity的主题中添加属性:actionOverflowMenuStyle
<!--设置menu菜单不遮挡actionbar--> <itemname="actionOverflowMenuStyle">@style/OverflowMenu</item> //创建这个主题,继承自主题Widget.AppCompat.PopupMenu <stylename="OverflowMenu"parent="Widget.AppCompat.PopupMenu.Overflow"> <!--兼容Api21之前的版本--> <itemname="overlapAnchor">true</item> <!--Api21--> <!--<itemname="android:overlapAnchor">false</item>--> </style>
消除左侧按钮的遗留空白:
设置不显示左上角返回按钮之后,它左边的空白仍然在显示。
设置Menu菜单:
1、取消menu菜单:
在复写的onCreateOptionsMenu方法返回false即可,或者不复写该方法。
设置Menu菜单按钮的颜色:
注意设置Activity的主题而不是Actionbar的主题:
<!--设置menu的文字颜色--> <!--<itemname="actionMenuTextColor">@color/yellow</item>--> <!--<itemname="android:actionMenuTextColor">@color/yellow</item>--> <!--上面两个设置是无效的--> <itemname="android:itemTextAppearance">@style/myCustomMenuTextApearance</item> <stylename="myCustomMenuTextApearance"parent="@android:style/TextAppearance.Widget.IconMenu.Item"> <!--文字颜色--> <itemname="android:textColor">@color/blue</item> <!--文字大小--> <itemname="android:textSize">16sp</item> </style>
2、设置Menu菜单的背景色:
也是在Activity的主题中进行设置
<!--s设置Menu菜单的背景色--> <itemname="android:itemBackground">@color/black_light</item>
3、自定义Menu菜单项:
除了使用系统给定的action,还可以自定义,这是需要使用actionviewandactionprovider,个人理解是可以提供视觉效果和交互功能的menuitem。
同样是在Menu中定义item,需要使用actionViewClass和actionLayout中的一个,其中actionViewClass指定使用的控件类名,如搜索控件SearchView,actionLayout指定自己定义的布局文件作为action的视图。
actionViewClass:Theclassofawidgetthatimplementstheaction.
actionLayout:Alayoutresourcedescribingtheaction'scomponents.
1).使用actionViewClass添加一个系统搜索item:
添加item:
<itemandroid: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 publicbooleanonCreateOptionsMenu(Menumenu){ //Inflatethemenu;thisaddsitemstotheactionbarifitispresent. getMenuInflater().inflate(R.menu.menu_main,menu); //找到ActionBar上所添加的UI组件的方法: mSearchView=(SearchView)menu.findItem(R.id.searchItem).getActionView(); mSearchView.setOnQueryTextListener(newSearchView.OnQueryTextListener(){ @Override publicbooleanonQueryTextSubmit(Stringstring){ Toast.makeText(ShowImageActivity.this,"查询:"+string,Toast.LENGTH_SHORT).show(); returnfalse; } @Override publicbooleanonQueryTextChange(Stringstring){ returntrue; } }); }
上面为item设置了app:showAsAction="ifRoom|collapseActionView"属性,其中collapseActionView含义是没有交互动作时(未点击时)搜索item收起只显示icon,有交互时,item展开充满actionbar剩余空间。搭配ifRoom表示有空间时展示到Appbar上,没空间时作为menuitem.never表示一直作为menuitem。always表示一直展示在Appbar上。
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
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns: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(Menumenu)方法中
MenuItemcollapseActionView=menu.findItem(R.id.searchItem); //Definethelistener MenuItemCompat.OnActionExpandListenerexpandListener=newMenuItemCompat.OnActionExpandListener(){ @Override publicbooleanonMenuItemActionCollapse(MenuItemitem){ //Dosomethingwhenactionitemcollapses ToastUtils.show(ShowImageActivity.this,"actionitemcollapses"); returntrue;//Returntruetocollapseactionview } @Override publicbooleanonMenuItemActionExpand(MenuItemitem){ //Dosomethingwhenexpanded ToastUtils.show(ShowImageActivity.this,"actionitemexpanded"); returntrue;//Returntruetoexpandactionview } }; MenuItemCompat.setOnActionExpandListener(collapseActionView,expandListener);
以上就是AndroidActionBar使用教程,希望对大家学习Android软件编程有所帮助。