Android轩辕剑之ActionBar之二

传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ 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屏幕的操作。
@Override

public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case android.R.id.home:

            // 在action bar点击app icon; 回到 home

            Intent 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()获取该元素。
@Override

public 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()方法来注册这个事件,然后就能够在操作视窗展开和折叠时接受这个回调方法了。
@Override

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.options, menu);

    MenuItem menuItem = menu.findItem(R.id.actionItem);

    ...

    menuItem.setOnActionExpandListener(new OnActionExpandListener() {

        @Override

        public boolean onMenuItemActionCollapse(MenuItem item) {

            return true;          
        }

        @Override

        public boolean onMenuItemActionExpand(MenuItem item) {

            return true; 

        }

    });

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值