本文主要内容:
1.导航按钮的事件响应
2.操作项action item的事件响应
一.导航按钮的事件响应
默认情况下,导航按钮(应用程序图标)显示在操作栏的左边。你能够把这个图标当做操作项来使用。导航按钮响应以下两个操作:
[向上级父层返回]
[向后平级“主”Activity返回]
1. 向后平级 返回应用程序的“主”Activity(必须调用setHomeButtonEnabled(true)方法):
当用户触摸导航按钮时,系统会调用Activity带有android.R.id.home ID的onOptionsItemSelected()方法。在这个响应中,你既可以启动主Activity,也可以返回你的应用程序结构化层次中用户上一步操作的界面。
如果你要通过导航按钮的响应来返回主Activity,那么就应该在Itent对象中包括FLAG_ACTIVITY_CLEAR_TOP标识。用这个标记,如果你要启动的Activity在当前任务中已经存在,那么,堆栈中这个Activity之上的所有的Activity都有被销毁,并且把这个Activity显示给用户。添加这个标识往往是重要的,因为返回主Activity相当与一个回退的动作,因此通常不应该再创建一个新的主Activity的实例,否则,最终可能会在当前任务中产生一个很长的拥有多个主Activity的堆栈。
例如,下例的onOptionsItemSelected()方法实现了返回应用程序的主Activity的操作:
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- // app icon in action bar clicked; go home
- Intent intent = new Intent(this, HomeActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivity(intent);
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
注意:如果你要使用导航按钮来返回主页,要注意从Android4.0(API 级别 14)开始,必须通过调用setHomeButtonEnabled(true)方法确保导航按钮能够作为一个操作项(在以前的版本,默认情况下,这个图标就能够作为一个操作项)。
2. 向上级父层返回 应用程序上级页面导航:

但是,如果在编辑完邮件之后,想要停留在Email应用程序中,那么向上导航就允许你把用户导航到Email应用程序中编辑邮件页面的上级页面,而不是返回到前一个Activity。图6演示了这种场景,在这个场景中,用户进入到Email应用程序后,不是按回退按钮,而是按操作栏图标来向上导航。
图6. 从People应用进入Email应用后,向上导航的行为。
要使导航按钮能够向上导航,就要在你的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的实际启动路径逐步的向会导航。
二.操作项action item的事件响应
在 onOptionsItemSelected 响应即可.
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- // app icon in action bar clicked; go home
- Intent intent = new Intent(this, HomeActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivity(intent);
- return true;
- case ...: break;
- default:
- return super.onOptionsItemSelected(item);
- }
- }