Android 4 导航(Navigation)

原文地址: http://blog.sina.com.cn/s/blog_559357d20101bscp.html


Google Offical Docs :

Tasks and Back Stack   Navigation with Back and Up



最近看到android文档上的Navigation这一块,可以说是基本针对android 4.0来说的,在android 4.1和4.2,实现已经简单了很多,下面就我自己的分析和实验说一下android 4.0以后的navigation。由于设计的内容比较多,所以可能会分几部分来写。


先介绍一下一些基本的概念。

1. ActionBar
在android 3.0之后,增加了Action Bar来统一android导航条的实现。具体可以看设计指引 Android Navigation Guide

2. Task and Back stack
一般来说(最简单普通的情况),一个app启动,会启动一个Task,然后在这个task里面按照堆栈的方式按照启动的顺序放入activity。举例来说,一个app,包含A, B, C, D四个Activity. 用户点击activity的顺序是A, B, C, B, D, 那么在task里面,从栈第到栈顶依次会是A, B, C, B, D这5个activity的instance。 这个时候,在D界面上点击back,D就会被弹出堆栈,android会显示activity B, 并且堆栈变为A, B, C, B.

3. Up and Back
在android导航中有两个基本的概念,一个是up,一个是back. 概念基本等同于windows资源管理器里面的后退和向上的概念。
Android <wbr>4 <wbr>导航(Navigation) <wbr>- <wbr>part <wbr>1

点击左图,将会把当前的activity pop出task的堆栈,并且调用改activity的destroy方法。点击右图的话,将会显示当前Activity的父Activity.

基本上来说,我们不需要对back实现任何代码,android已经帮我们都做了,下面我们就来具体看看up的实现。

Android 4.0的Up实现

在android 4.0中,我们需要自己维护activity之间的父子关系。

    @Override

public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case android.R.id.home:

            // This is called when the Home (Up) button is pressed

            // in the Action Bar.

            Intent parentActivityIntent = new Intent(thisMyParentActivity.class);

            parentActivityIntent.addFlags(

                    Intent.FLAG_ACTIVITY_CLEAR_TOP |

                    Intent.FLAG_ACTIVITY_NEW_TASK);

            startActivity(parentActivityIntent);

            finish();

            return true;

    }

    return super.onOptionsItemSelected(item);

}


当然,android还给我们提供了utility方法实现这一功能,首先,我们要给activity添加如下属性:

<meta-data android:name="android.support.PARENT_ACTIVITY"

                       android:value=".ParentActivity" />


然后,在onOptionsItemSelected方法中,调用如下方法。

 

NavUtils.navigateUpFromSameTask(this);


Android 4.1的Up实现
在android4.1及以后的版本中,android已经帮我们完成了大部分的功能,只要给activity添加如下属性android:parentActivityName,android会自动维护activity之间的父子关系,我们不需要为up实现任何代码。

<activity android:name=".ChildActivity"

                  android:label="@string/child_label"

                  android:parentActivityName=".ParentActivity">

</activity>


另外补充一点,假设有如下Activity之间的关系
GrandParentActivity, ParentActivity, ChildActivity.

假设用户打开GrandParentActivity -> ChildActivity,这个时候,由于在task中并没有ParentActivity,及时用户点击了up,界面不会跳转到ParentActivity,而是GrandParentActivity,也就是父亲的祖先。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值