传送门☞轮子的专栏☞转载请注明☞http://blog.csdn.net/leverage_1229

4使用应用程序图标来导航

默认情况下,应用程序图标显示在action bar的左边。你能够把这个图标当做action item来使用。应用程序应该在这个图标上响应以下两个操作之一:
返回应用程序的“主”Activity,返回“home”界面;
向应用程序上层结构返回。
当用户触摸这个图标时,系统会调用Activity带有android.R.id.home ID的onOptionsItemSelected()方法。在这个响应中,你既可以启动home屏幕,也可以返回你的应用程序结构化层次中用户上一步操作的界面。
如果你要通过应用程序图标的响应来返回home屏幕,那么就应该在Intent对象中包含FLAG_ACTIVITY_CLEAR_TOP标识。用这个标志,如果你要启动的Activity在当前任务中已经存在,那么,堆栈中这个Activity之上的所有的Activity都有被销毁,并且把这个Activity显示给用户。添加这个标志往往是重要的,因为返回home屏幕相当与一个回退的动作,而不是创建。
下面例子的onOptionsItemSelected()方法实现了返回应用程序的home屏幕的操作。

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case android.R.id.home:// 在action bar点击app icon; 回到 homeIntent intent = new Intent(this, HomeActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);return true;default:return super.onOptionsItemSelected(item);}}

在用户从另一个应用程序进入当前Activity的情况下,你可能还想要添加FLAG_ACTIVITY_NEW_TASK标识。这个标识确保在用户返回home或上级界面时,新的Activity不会被添加到当前的任务中,而是在属于你自己的应用程序的任务中启动。例如,如果用户通过另一个应用程序调用的Intent对象启动了你的应用程序中的一个Activity,那么用户选择action bar图标来返回home或上级界面时,FLAG_ACTIVITY_CLEAR_TOP标识会在属于你的应用程序的任务中启动这个Activity(不是当前任务)。系统既可以用这个新的Activity做根Activity来启动一个新的任务,也可以把存在后台的拥有这个Activity实例的一个既存任务带到前台来,并且目标Activity会接受onNewIntent()回调。因此,如果你的Activity要接收另一个应用程序的Intent对象,那么通常应该给这个Intent对象添加FLAG_ACTIVITY_NEW_TASK标识。

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

注意:如果你要使用应用图标来返回主页,要注意从Android4.0(API 级别 14)开始,必须通过调用setHomeButtonEnabled(true)方法确保这个图标能够作为一个action item(在以前的版本,默认情况下,这个图标就能够作为一个action item的)。

4.1应用程序向上导航

作为传统的回退导航(把用户带回任务历史中的前一个窗口)的补充,你能够让action bar图标提供向上导航的功能,它应用把用户带回到你的应用程序的上级界面。例如,当前界面时你的应用程序层次比较深的一个界面,点击应用程序图标应该返回返回上一级页面(当前界面的父界面)。

当用户从一个应用程序导航到一个属于不同应用程序的Activity时,“回退”按钮的行为。

但是,如果在编辑完邮件之后,想要停留在Email应用程序中,那么向上导航就允许你把用户导航到Email应用程序中编辑邮件页面的上级界面,而不是返回到前一个Activity。

要是应用程序图标能够向上导航,就要在你的ActionBar中调用SetDisplayHomeAsUpEnabledtrue(true)方法。

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);ActionBar actionBar = getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);...}

当用户触摸这个图标时,系统会调用带有android.R.id.home ID的onOptionsItemSelected()方法。
请记住在Intent对象中使用FLAG_ACTIVITY_CLEAR_TOP标识,以便你不会这个父Activity存在的情况下,再创建一个新的实例。例如,如果你不使用FLAG_ACTIVITY_CLEAR_TOP标识,那么向上导航后,再按回退按钮,实际上会把用户带到应用程序的下级界面,这是很奇怪的。
注意:如果有很多用户能够到达应用程序中当前Activity的路径,那么,向上图标应该沿着当前Activity的实际启动路径逐步的向后导航。

5添加Action View

Action View是作为action item按钮的替代品显示在action bar中的一个widget。例如,如果你有一个用于搜索的可选菜单项,你可以用SearchView widget来替代action ba的搜索按钮。

要在菜单资源中的一个item声明一个action view,你既可以使用android:actionLayout属性也android:actionViewClass属性来分别指定一个布局资源或要使用的可视构件类。

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@+id/menu_search"android:title="@string/menu_search"android:icon="@drawable/ic_menu_search"android:showAsAction="ifRoom|collapseActionView"android:actionViewClass="android.widget.SearchView" /></menu>

android:showAsAction属性也可包含“collapseActionView”属性值,这个值是可选的,并且声明了这个action view应该被折叠到一个按钮中,当用户选择这个按钮时,这个action view展开。否则,这个action view在默认的情况下是可见的,并且即便在用户不用的时候,也要占据action bar的有效空间。如果需要给action view添加一些事件,那么就需要在onCreateOptionsMenu()回调期间做点事。你能够通过调用带有菜单项ID的findItem()方法来获取菜单项,然后再调用getActionView()获取该元素。

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.options, menu);SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();// 配置搜索信息并添加事件监听器...return super.onCreateOptionsMenu(menu);}

5.1处理可折叠的action views

Action views让你在不改变Activity或Fragment的情况下,就可以给用户提供快捷的访问和丰富的操作。但是,默认情况下让action views可见可能不太合适。要保证action bar的空间(尤其是在小屏幕设备上运行时),你能够把action view折叠进一个action item按钮中。当用户选择这个按钮时,action view就在action bar中显示。被折叠的时候,如果你定义了android:showAsAction=“ifRoom”属性,那么系统可能会把这个项目放到溢出菜单中,但是当用户选项了这个菜单项,它依然会显示在action bar中。通过给android:showAsAction属性添加“collapseActionView”属性值,你能够让action view可以折叠起来。
因为在用户选择这个item时,系统会展开这个action view,所以你不需要在onOptionsItemSelected()回调方法中响应这个菜单项。在用户选择这个菜单项时,系统会仍然会调用onOptionsItemSelected()方法,但是除非你在方法中返回了true(指示你已经替代系统处理了这个事件),否则系统会始终展开这个action view。
当用户选择了action bar中的“向上”图标或按下了回退按钮时,系统也会把action view折叠起来。如果需要,你能够在代码中通过在expandActionView()和collapseActionView()方法来展开或折叠action view。
注意:尽管把操作视窗折叠起来是可选的,但是,如果包含了SearchView对象,建议你始终把这个视窗折叠起来,只有在需要的时候,由用户选择后才把它给展开。在提供了专用的“搜索”按钮的设备上也要小心了,如果用户按下了“搜索”按钮,那么也应该把这个搜索action view给展开,简单的重写Activity的onKeyUp()回调方法,监听KEYCODE_SEARCH类型的按键事件,然后调用expandActionView()方法即可。
如果你需要根据操作视窗的可见性来更新你的Activity,那么你可以定义一个OnActionExpandListener事件,并且用setOnActionExpandListener()方法来注册这个事件,然后就能够在操作视窗展开和折叠时接受这个回调方法了。

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.options, menu);MenuItem menuItem = menu.findItem(R.id.actionItem);...menuItem.setOnActionExpandListener(new OnActionExpandListener() {@Overridepublic boolean onMenuItemActionCollapse(MenuItem item) {return true;          }@Overridepublic boolean onMenuItemActionExpand(MenuItem item) {return true; }});}

Android轩辕剑之ActionBar之二相关推荐

  1. Android轩辕剑之ActionBar之四

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 8添加下拉式导航 作为Activity内部的另一种导航(或过滤)模式,操作栏提供了内置 ...

  2. Android轩辕剑之ActionBar之三

    传送门☞轮子的专栏☞转载请注明☞http://blog.csdn.net/leverage_1229 6添加Action Provider 与action view类似,Action Provider ...

  3. Android轩辕剑之ActionBar之一

    传送门☞轮子的专栏☞转载请注明☞http://blog.csdn.net/leverage_1229 Action Bar是一个能用于确定应用程序和用户的位置,并提供给用户操作和导航模式的窗口功能.如 ...

  4. Android 顶部标题栏ActionBar详解

    转载自http://www.cnblogs.com/yc-755909659/p/4290784.html 一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外, ...

  5. 疯狂Android讲义 - 学习笔记(二)

    疯狂Android讲义 - 学习笔记(二) Android应用的用户界面编程 2.1 界面编程与视图(View)组件 Android应用的绝大部分UI组件放在android.widget.androi ...

  6. 【朝花夕拾】Android性能篇之(二)Java内存分配

    前言       原文:[朝花夕拾]Android性能篇之(二)Java内存分配        在内存方面,相比于C/C++程序员,咱们java系程序员算是比较幸运的,因为对于内存的分配和回收,都交给 ...

  7. Android 10.0 PackageManagerService(二)权限扫描-[Android取经之路]

    摘要:PackageManagerService在systemReady()后,进行了/system/etc/permissions中的各种xml进行扫描,进行相应的权限存储,供以后使用 阅读本文大约 ...

  8. Android系列之Fragment(二)----Fragment的生命周期和返回栈

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  9. Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现...

    Android高级控件(二)--SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现 写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还 ...

最新文章

  1. 分布式系统设计注意点
  2. pr图形模板预设怎么使用_技术丨PR怎样安装动态图形模板?Pr mac版怎样调用Mogrt预设?Adobe Premiere导入MOGRTs预设完整教程...
  3. wxWidgets:显示 wxTreeListCtrl 的示例
  4. 大数据最核心的关键技术——32个算法,记得收藏!
  5. Web pack misc
  6. 在ASP.NET中利JavaScript实现控件的聚焦
  7. ijkplayer 消息循环处理过程分析
  8. 中国软件开发project师之痛
  9. Effective c++读书笔记
  10. HttpClient工具类 HttpClientUtils.java
  11. 第一模块:开发基础 第1章 练习及作业
  12. xpath用于HTML文档通过元素,通过Xpath定位元素
  13. 解决FAT32格式U盘安装win10时0x8007000D错误
  14. 浅谈JdbcDaoSupport
  15. ubuntu 修改系统默认语言为英文!
  16. 2、深入HTTP请求流程
  17. 解决谷歌浏览器切后台会停止游戏
  18. ROS1中Gazebo案例都有哪些机器人呢(Noetic2022)
  19. PTA L1-020 帅到没朋友 (20 分)(C++)
  20. Python——dat文件批量合并为同一个csv文件

热门文章

  1. 服务器虚拟化十大因素
  2. addroutes没添加进去_CAD中如何绘制函数曲线及添加数学公式
  3. python widget_python 图形界面
  4. 杭电计算机组成原理教材答案,杭电计算机组成原理包建课后作业答案详解.doc...
  5. 阿里“10”年软件测试经验,面试官通常...........
  6. 21天Jenkins打卡Day14-maven服务
  7. csv批量读取测试数据
  8. 疫情,降薪,跳槽工作难找,任务重加班多,程序员的出路在何方?
  9. awk bc命令 linux_Linux 的 awk 命令教程手册,建议收藏!
  10. http接口_基于Python的HTTP接口自动化测试框架实现