引入:
概念:动作栏或导航控件,Action Bar 就是替换3.0 以前的title bar 和Menu。
主要功能:
1)突出显示一些重要操作(如“注册”,“登录”,“搜索”等,将平时隐藏的选项菜单显示成活动項ActionItem。
2)在程序中保持一致的页面导航和切换方式。这中基于Tab的导航方式,可以切换多个Fragment。
3)提供基于下拉的导航菜单。
4)使用程序Logo,作为返回App的Home主页面或者向上的导航操作。
组成:
ActionBar分成四个区域
1)app icon 图标区
可显示App的icon,也可用其他图标代替。当软件不再最高级页面时,图标左侧会显示一个左箭头,用户可以通过这个箭头向上导航。
2)View Control 视图切换
drop-down菜单或tab controls,也可以用来显示非交互的内容,例如app title或更长的品牌信息。
3)action buttons 动作按钮
这个放最重要的软件功能,放不下的按钮就自动进入Action Overflow了。
4)action overflow 溢出动作項
不常用的操作项目自动放入Action Overflow
ActionBar操作
1.添加与删除ActionBar
添加ActionBar:设置主题带有AcitonBar就行了,如Theme.Hole,3.0一下使用ActionBar,需导入v7兼容包。
删除ActionBar:
1)设置主题没有ActionBar
2)主题隐藏ActionBar,getSupportActionBar().hide()
2.添加ActionBar动作項
1)动作項写入Menu文件,如同添加系统菜单一样,重写onCreateOptionsMenu()
eg:
1 <?xml version="1.0" encoding="utf-8"?> 2 <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto"> 4 5 <item android:id="@+id/action_edit" 6 android:title="编辑" 7 android:orderInCategory="80" 8 android:icon="@android:drawable/ic_menu_edit" 9 app:showAsAction="ifRoom" /> 10 11 <item android:id="@+id/action_share" 12 android:title="分享" 13 android:orderInCategory="90" 14 android:icon="@android:drawable/ic_menu_share" 15 app:showAsAction="ifRoom" /> 16 17 <item android:id="@+id/action_settings" 18 android:title="settings" 19 android:orderInCategory="100" 20 app:showAsAction="never"/> 21 22 </menu>
2)通过给<item>元素声明android:showAsAction属性:
never:不将该MenuItem显示在ActionBar上(是默认值)
always:总是将MenuItem显示在ActionBar上
ifRoom:当ActionBar位置充裕时将该MenuItem显示在ActionBar上
withText:将该MenuItem显示在ActionBar上,兵显示该菜单项的文本
collapseActionView:将该ActionView折叠成普通菜单项(api>=14)
3)重写OnOptionsItemSelected()回调方法,处理用户选择动作項的操作。
3.启动程序图标导航
作用:是让App的Logo也变成可以点击的导航图标
ActionBar actionBar = getSupportActionBar();//获取当前Activity的ActionBar
actionBar.setDisplayHomeAsUpEnabled(true);//设置是否将Logo图标转成可点击的按钮,并在图标前添加一个向左的箭头
actionBar.setDisplayShowHomeEnabled(true);//设置是否显示Logo图标
actionBar.setHomeButtonEnabled(true);//设置是否将Logo图标设置成可点击的按钮
4.ActionView的使用(Api>=11,getActionView()有效
作用:可编辑的动作項,如SearchView可以直接在ActionBar上使用
添加ActionView的两种方式:
1)android:actionLayout,指定一个布局文件
2)android:actionViewClass属性,指定实现CollaspsibleActionView的子类
手动展开和折叠菜单栏:
MenuItem.expandActionView()//展开ActionView
MenuItem.collapseActionView()//折叠ActionView
MunuItem.setOnActionExpandListener()//设置展开或折叠的监听事件
eg:
1 <menu xmlns:android="http://schemas.android.com/apk/res/android" > 2 3 <!-- actionViewClass 设置ActionView控件的UI类 --> 4 <item 5 android:id="@+id/action_search" 6 android:orderInCategory="100" 7 android:showAsAction="ifRoom" 8 android:actionViewClass="android.widget.SearchView" 9 android:title="检索"/> 10 11 <!-- actionLayout 属性设置自定义ActionView的布局文件 --> 12 <item 13 android:id="@+id/action_search_custom" 14 android:orderInCategory="100" 15 android:showAsAction="always|collapseActionView" 16 android:actionLayout="@layout/actionview_search" 17 android:icon="@android:drawable/ic_menu_agenda" 18 android:title="自定义检索"/> 19 20 </menu>
5.ActionBar的Tab导航
作用:通常用选项标签使Fragment之间相互切换
步骤:
1)设置导航模式,调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)
2)创建多个Tab,设置setTabListener()监听事件,添加到ActionBar
3)实现TabLisenter接口的方法
eg:
1 private void initActionBar() { 2 // TODO 初始化ActionBar中的相关设置 3 actionBar=getActionBar();//获取ActionBar对象 4 5 //1. 设置ActionBar的导航模式: tab选项卡的导航模式 6 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 7 8 //3. 创建Tab 9 Tab tab1=actionBar.newTab() 10 .setText("头条") 11 .setIcon(android.R.drawable.ic_menu_add) 12 .setTabListener(this); 13 14 Tab tab2=actionBar.newTab() 15 .setText("军事") 16 .setIcon(android.R.drawable.ic_menu_agenda) 17 .setTabListener(this); 18 19 Tab tab3=actionBar.newTab() 20 .setText("国内") 21 .setIcon(android.R.drawable.ic_menu_delete) 22 .setTabListener(this); 23 24 Tab tab4=actionBar.newTab() 25 .setText("国际") 26 .setIcon(android.R.drawable.ic_menu_camera) 27 .setTabListener(this); 28 29 Tab tab5=actionBar.newTab() 30 .setText("体育") 31 .setIcon(android.R.drawable.ic_menu_compass) 32 .setTabListener(this); 33 34 //4. 增加Tab到ActionBar中 35 actionBar.addTab(tab1); 36 actionBar.addTab(tab2); 37 actionBar.addTab(tab3); 38 actionBar.addTab(tab4); 39 actionBar.addTab(tab5); 40 }
实现TabListener接口的三个方法:
1 @Override 2 public void onTabSelected(Tab tab, FragmentTransaction ft) { 3 // TODO 选择Tab事件 4 Log.i("info", "onTabSelected-----"+tab.getPosition()); 5 6 ContentFragment cf= 7 ContentFragment.newInstace(tab.getText().toString()); 8 9 ft.replace(R.id.mainLayoutId, cf); 10 11 } 12 13 @Override 14 public void onTabUnselected(Tab tab, FragmentTransaction ft) { 15 // TODO 取消选择Tab事件 16 Log.i("info", "onTabUnselected-----"+tab.getPosition()); 17 } 18 19 @Override 20 public void onTabReselected(Tab tab, FragmentTransaction ft) { 21 // TODO 重新选择Tab事件 22 Log.i("info", "onTabReselected-----"+tab.getPosition()); 23 24 }
布局文件:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context=".MainActivity" 10 android:id="@+id/mainLayoutId" > 11 12 </RelativeLayout>
6.ActionBar扩充:
ActionProvide的使用。
添加下拉式导航 等。