android 之 ActionBar
一 前言
Action bar就是替换3.0以前的tittle bar和menu。
Action overflow:把不常用的Actions移到Action overflow
小石头的博客 http://blog.csdn.net/lu1024188315/article/details/74518599
二 主题
从3.0开始,Android默认已经启用了ActionBar,使用Android主题(Theme)
Android包含了两种基准的主题,这决定了action bar的颜色:
你可以通过在<application> 元素下声明android:theme来将主题应用到整个应用中,也可以通过在单独的<activity>元素上声明android:theme将主题应用在一个单独的Activity上。
例如:
<applicationandroid:theme="@android:style/Theme.Holo.Light" ... />
![](/assets/blank.gif)
你也可以通过声明Theme.Holo.Light.DarkActionBar 主题让你的action bar为深色,但其余部分都为浅色。.
当在使用Support Library时,你必须使用Theme.AppCompat 主题作为代替:
确保你在action bar上使用的icon的颜色与你的主题合适。为了帮助你,这里(Action Bar Icon Pack)有浅色和深色action bar对应的合适的action icons。
三 显示和隐藏ActionBar
android studio隐藏ActionBar:
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
ActionBar bar = getActionBar(); //获得ActionBar对象
bar.show(); //显示ActionBar
bar.hide(); //隐藏ActionBar
四 给ActionBar增加动作项
1 加载在XML文件中定义的菜单项资源
@Override
public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_activity, menu); return true; }
在菜单资源的xml文件中,你能够通过给<item>元素声明android:showAsAction=”ifRoom”属性,请求把一个菜单项作为一个操作项来显示。用这种方式,只在有有效的空间时,菜单项才能显示在Action bar中。如果没有足够的空间,这个菜单项会显示在悬浮菜单中。
如果你的菜单项支持标题和图标即带有android:title和android:icon属性---那么默认情况下,操作项仅显示图标。如果你要显示文本标题,就要给android:showAsAction属性添加withText设置,如:
android:icon="@drawable/ic_menu_save"
android:title="@string/menu_save"
android:showAsAction="ifRoom|withText"
注意:
- withText值示意Action bar要显示文本标题。Action bar会尽可能的显示这个标题,但是,如果图标有效并且受到Action bar空间的限制,文本标题有可能显示不全。
- 每个菜单项尽量都设置title属性。如果ActionBar没有空间显示操操作项的时候,则会把这item放入到悬浮菜单中,并仅显示标题。
- android:showAsAction的值尽量不要选择always,太多的操作项会创建一个混乱的UI,并且会导致窄屏设备上的布局问题。用ifRoom是个比较好的选择。
当用户选择了一个操作项时,Activity会接收一个onOptionsItemSelected()的回调,要把android:id属性支持的ID传递给这个方法。可以在这个方法内部对来响应每个具体的操作项。
注意:
如果该Activity有托管Fragment,则Fragment也可以向ActionBar中添加操作项,添加方式同上。但是必须在Fragment中onActivityCreated()方法中调用setHasOptionsMenu(true); 通知Activity我有菜单要添加。
添加到Fragment中代码块如下:
public void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);setHasOptionsMenu(true);//通知Activity,当前Fragment也有菜单}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, container, false);return view;}/** * Fragment也可以有自己的菜单,但是需要Activity来帮助加载 */@Overridepublic void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {Log.e("MyFragment", "onCreateOptionsMenu....");inflater.inflate(R.menu.fragment_menu, menu);}/** * 线执行Activity中的onOptionsItemSelected,然后再执行Fragment中的方法。 */@Overridepublic boolean onOptionsItemSelected(MenuItem item) {Toast.makeText(getActivity(), "Fragemtn的菜单被执行", 0).show();return super.onOptionsItemSelected(item);}
2 往ActionBar添加SearchView代码块如下:
XML中添加搜索按钮:
<itemandroid:id="@+id/search"android:icon="@android:drawable/ic_search_category_default"android:showAsAction="always|collapseActionView"android:actionViewClass="android.widget.SearchView"android:title="搜索"/>
设置监听:
public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main_manu, menu);MenuItem item = menu.findItem(R.id.search); //根据MenuItem的id找到指定的MenuItem//找到这个Item中的ActionViewsearchView.setOnQueryTextListener(new OnQueryTextListener() { //给SearchView设置搜索的监听器@Overridepublic boolean onQueryTextSubmit(String query) {Toast.makeText(MainActivity.this, "开始搜索.....", 0).show();return false;}@Overridepublic boolean onQueryTextChange(String newText) {return false;}});return super.onCreateOptionsMenu(menu); }
![](/assets/blank.gif)
五 使用分离式操作栏
只需简单的在<application>或<activity>元素中添加uiOptions=”splitActionBarWhenNarrow”属性设置就可以了。
android:uiOptions="splitActionBarWhenNarrow"
六 启用程序图标导航
为了将应用程序图标转变成可以点击的图标,可以调用ActionBar的如下方法。
- setDisplayHomeAsUpEnabled(true); //设置是否将应用程序图标转变成可点击的图标,并在图标上添加一个向左的箭头。
- setDisplayHomeAsUpEnabled(true) //设置是否显示应用程序图标4
- setHomeButtonEnable(true) //设置是否讲应用程序图标转变成可点击的按钮
- 当点击应用程序图标,相当于点击了一个id是android.R.id.home的菜单项,然后进行进一步的处理,比如使用Intent对象回到主Activity。
![](/assets/blank.gif)
注意:第3个方法,在4.0之前默认是true,从4.0开始默认是false,如果想能够点击必须调用该方法。但是如果调用了第1个方法设置为true,则第3个方法也会被设置为true。
代码块:
getActionBar().setDisplayHomeAsUpEnabled(true);
注意:
如果你要通过应用程序图标的响应来返回主Activity,那么就应该在Itent对象中包括FLAG_ACTIVITY_CLEAR_TOP标识(和SingleTask的作用是一样的)。用这个标记,如果你要启动的Activity在当前任务中已经存在,那么,堆栈中这个Activity之上的所有的Activity都有被销毁,并且把这个Activity显示给用户。添加这个标识往往是重要的,因为返回主Activity相当与一个回退的动作,因此通常不应该再创建一个新的主Activity的实例,否则,最终可能会在当前任务中产生一个很长的拥有多个主Activity的堆栈
Intent intent=new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
七 改变ActionBar背景色
<resources><style name="AppTheme" parent="android:Theme.Light" /><drawable name="BackBar">#ff00</drawable>......</resources>
使用修改setBackgroundDrawable背景色:
//改变ActionBar的背景色 actionBar.setBackgroundDrawable(getDrawable(R.drawable.action_bg));
八 实现Tab导航
ActionBar最常用的功能就是实现Tab导航,ActionBar在顶端生成多个Tab标签,当用户点击某个Tab标签时,系统会根据用户点击事件导航指定的Tab界面,ActionBar实现Tab导航步骤如下:
(1)调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)函数,设置Tab导航方式;
(2)调用ActionBar的addTab()函数,添加过个Tab标签,并且为每个Tab标签添加点击事件;
而Tab的常用方法有:
setText()设置标题;setIcon()设置图标;setTabListener();设置监听器;setTag(Int fag );设置标志;
1 设置ActionBar为Tab导航
actionBar = getActionBar();actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
2 创建Fragment
fragment1 = new ActionFragment();fragment2 = new ActionFragment2();fragment3 = new ActionFragment3();
3 创建Tabs
ActionBar.Tab tab = actionBar.newTab().setText("标题1").setIcon(R.mipmap.ic_launcher).setTabListener(this).setTag(1);ActionBar.Tab tab2 = actionBar.newTab().setIcon(R.mipmap.ic_launcher).setText("标题2").setTabListener(this).setTag(2);ActionBar.Tab tab3 = actionBar.newTab().setText("标题3").setIcon(R.mipmap.ic_launcher).setTabListener(this).setTag(3);actionBar.addTab(tab);actionBar.addTab(tab2);actionBar.addTab(tab3);actionBar.setSelectedNavigationItem(1);//设置第一个默认的item
4 设置Tab监听实现切换tab
@Overridepublic void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {switch ((Integer)tab.getTag()){case 1:ft.replace(R.id.frame_action_container,fragment1);break;case 2:ft.replace(R.id.frame_action_container,fragment2);break;case 3:ft.replace(R.id.frame_action_container,fragment3);break;}}@Overridepublic void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {switch ((Integer)tab.getTag()){case 1:ft.remove(fragment1);break;case 2:ft.remove(fragment2);break;case 3:ft.remove(fragment3);break;}}@Overridepublic void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {}
效果图:
九 实现下来式导航
ActionBar实现下拉式导航步骤如下:
(1)调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_LIST)函数,设置Tab导航方式;
(2)调用ActionBar的setLIstNavigationCallBacks(SpinnerAdapter adapter,ActionBar.OnNavigationListener callBack)函数添加列表项
//获取该Activity的ActionBar: ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
2 创建Fragment集合
//fragments为 ArrayList<Fragment> fragments = new ArrayList<>() fragments.add(new ActionFragment()); fragments.add( new ActionFragment2()); fragments.add( new ActionFragment3());
3 创建Adapter
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1,new String[]{"第一页","第二页","第三页"});
4 添加列表项并设置监听
actionBar.setListNavigationCallbacks(arrayAdapter, new ActionBar.OnNavigationListener() {@Overridepublic boolean onNavigationItemSelected(int itemPosition, long itemId) {if (currentFragmentIndex >=0 && currentFragmentIndex < fragments.size()){fragments.get(currentFragmentIndex).onStop();}switch (itemPosition){case 0:if (currentFragmentIndex != 0){fragmentTransaction = fragmentManager.beginTransaction();if (!fragments.get(0).isAdded()){//如果要显示的Fragment还没有添加过,则需要添加到fragmentTransaction中fragmentTransaction.add(R.id.frame_action_container,fragments.get(0));}else {//如果要显示的Fragment已经添加过,则隐藏当前的fragment,展现要显示的Fragmentfragments.get(0).onStart();if (currentFragmentIndex >=0 && currentFragmentIndex < fragments.size()){fragmentTransaction.hide(fragments.get(currentFragmentIndex));}fragmentTransaction.show(fragments.get(0));}//提交业务fragmentTransaction.commit();//保存当前的Fragment的索引currentFragmentIndex = 0;}break;case 1://同上,只是把上面的0换为1break; case 2://同上,只是把上面的0换为2 break;}return false;} });
效果图:
![](/assets/blank.gif)
十 ActionBar获取失败解决办法
@android:style/Theme.NoTitleBar
<item name="windowActionBar">false</item> <item name="android:windowNoTitle">true</item>
<!-- 这时需要改为@android:style/xxx 例如 @android:style/Theme.Holo.Light --></style>
requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
上面的两句代码,上面一句设置Activity不显示TitleBar, 下一句则设置Activity为全屏模式,这两句代码都会导致 ActionBar
无法显示,从而使 getActionBar()获取失败,如果你的项目中的 Activity 有父一级别的 Activity,则也需要将父一级别的Activity中的NoTitle和全屏代码注释掉;
3 getActionBar与getSupportActionBar
4 其它原因
android 之 ActionBar相关推荐
- 【Android】ActionBar的使用(1)
前(fei)言(hua):转行iOS开发半年,很久没接触Android了,前几天去上课,听着实在无聊,随手拿了同学的一本<Android UI设计>,发现有好多基础知识自己虽然用过,但是都 ...
- android 自定义命名空间,Android自定义ActionBar实例
本文实例讲述了android自定义actionbar的实现方法.分享给大家供大家参考.具体实现方法如下: android 3.0及以上已经有了actionbar的api,可以通过引入support p ...
- Android之ActionBar
本文主要包括以下内容 ActionBar的显示及隐藏,添加图标,返回主页 ActionBar添加ActionView,添加ActionProvider ActionBar实现Tab ActionBar ...
- 2013-2-19 Android之ActionBar学习(转)
2013-2-19 Android之ActionBar学习(转) Android之ActionBar学习 - Android移动开发技术文章_手机开发 - 红黑联盟 资讯 | 安全 | 论坛 | ...
- android 自定义actionbar前面有一块空白,解决Android V7后自定义Toolbar、ActionBar左侧有空白问题...
如图所示: 1.查看Wiget.AppCompat.Toolbar的parent主题,如下所示: @style/TextAppearance.Widget.AppCompat.Toolbar.Titl ...
- Android使用ActionBar和ViewPager切换页面
演示效果如下: 项目布局如下: MainActivity.java代码 <code class="hljs java has-numbering" style=&qu ...
- android 标题图标,android 中 actionbar 常用方法。设置标题,隐藏图标等
设置标题: actionBar.setTitle("关于我们"); 使返回箭头出现 actionBar.setDisplayHomeAsUpEnabled(true); 监听返回按 ...
- Android之ActionBar常用设计和使用总结
常用ActionBar总结 我们经常看见项目的顶部有一些文字显示在中间,或者左边.右边,而且还有一个返回的图标,很方便我们返回,接下来我总结下常用的ActionBar 第一步:写常见的 ...
- android中ActionBar的几个属性
actionBar.setHomeButtonEnabled //小于4.0版本的默认值为true的.但是在4.0及其以上是false,该方法的作用:决定左上角的图标是否可以点击.没有向左的小图标. ...
最新文章
- Netadvantage锁定grid列和锁定Excel栏位
- git push 代码报错 Pushing to Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
- 05_通过sql操作表中的数据_插入修改删除查询
- Java虚拟机-内存分配策略
- 转载:WPF binding
- VS2008(C#)子页嵌套母版页的控件访问方法(二)
- git bash 出现vim的时候怎么退出
- prototype.js学习(1)
- 计算机boot进入u盘启动,BIOS中设置U盘启动的几种方法
- ps联盟服务器无响应怎么办,PS联盟网新手教程视频
- 清除Zabbix的历史记录
- java校验身份证的合法性
- java obd_XTOOL X100 PAD3通过OBD给2014 BMW CAS4 Key编程
- HPS SoC和FPGA联合使用例程
- 计算机主流处理器介绍,现在电脑主流配置有哪些 2017主流电脑配置清单一览表...
- 简明扼要的概述微服务设计原则,深入开发微服务,就从今天开始
- 副屏幕全屏_电脑 双屏(双屏电脑主屏副屏设置)
- 数据分析的重要一环之数据统计
- 淘宝电商用户行为数据分析及可视化—基于MySQL/Power BI(含代码)
- 《黄金矿工》挖矿游戏 前端高阶版本,Cocos2d-js,附项目源码
热门文章
- win7字体_从零开始修电脑__如何在win7系统下分区
- Open Cluster Management 部署应用实践
- 简单手机号码数据加密解密
- linux下sos使用教程,SOS SOS SOS SOS SOS SOS
- 国产操作系统第一股,杨涛的麒麟信安是否名副其实?
- 微软机器翻译系统:中-英翻译水平可“与人类媲美”
- Editors Vulnerability Handbook
- Arduino基本语法
- 鲸鱼优化算法(WOA)
- vue.js 3.0 Bate 详解【持续更新】