提供向后的导航

转载 2015年11月20日 17:25:46

所有不是从主屏幕("home"屏幕)进入app的,都应该给用户提供一种方法,通过点击action bar中的Up按钮。可以回到app的结构层次中逻辑父屏幕。本课程向你说明如何正确地实现这一操作。

Up Navigation 设计

Designing Effective Navigation和the Navigation design guide中描述了向上导航的概念和设计准则。

Figure 1. action bar中的Up按钮.

Figure 1. action bar中的Up按钮.

指定父Activity

要实现向上导航,第一步就是为每一个activity声明合适的父activity。这么做可以使系统简化导航模式,例如向上导航,因为系统可以从manifest文件中判断它的逻辑父(logical parent)activity。

从Android 4.1 (API level 16)开始,你可以通过指定<activity>元素中的android:parentActivityName属性来声明每一个activity的逻辑父activity。

如果你的app需要支持Android 4.0以下版本,在你的app中包含Support Library并添加<meta-data>元素到<activity>中。然后指定父activity的值为android.support.PARENT_ACTIVITY,并匹配android:parentActivityName的值。

例如:

<application ... >
    ...
    <!-- main/home activity (没有父activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- 主activity的一个子activity -->
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- 父activity的meta-data,用来支持4.0以下版本 -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

在父activity这样声明后,你可以使用NavUtils API进行向上导航操作,就像下一面这节。

添加向上操作(Up Action)

要使用action bar的app图标来完成向上导航,需要调用setDisplayHomeAsUpEnabled():

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

这样,在app旁添加了一个左向符号,并用作操作按钮。当用户点击它时,你的activity会接收一个对onOptionsItemSelected()的调用。操作的ID是android.R.id.home

向上导航至父activity

要在用户点击app图标时向上导航,你可以使用NavUtils类中的静态方法navigateUpFromSameTask()。当你调用这一方法时,系统会结束当前的activity并启动(或恢复)相应的父activity。如果目标activity在任务的后退栈中(back stack),则目标activity会像FLAG_ACTIVITY_CLEAR_TOP定义的那样,提到栈顶。提到栈顶的方式取决于父activity是否处理了对onNewIntent()的调用。

例如:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // 对action bar的Up/Home按钮做出反应
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

但是,只能是当你的app拥有当前任务(current task)(用户从你的app中发起这一任务)时navigateUpFromSameTask()才有用。如果你的activity是从别的app的任务中启动的话,向上导航操作就应该创建一个属于你的app的新任务,并需要你创建一个新的后退栈。

用新的后退栈来向上导航

如果你的activity提供了任何允许被别的app启动的intent filters,那么你应该实现onOptionsItemSelected()回调,在用户从别的app任务进入你的activity后,点击Up按钮,在向上导航之前你的app用相应的后退栈开启一个新的任务。

在这么做之前,你可以先调用shouldUpRecreateTask()来检查当前的activity实例是否在另一个不同的app任务中。如果返回true,就使用TaskStackBuilder创建一个新任务。或者,你可以向上面那样使用navigateUpFromSameTask()方法。

例如:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // 对action bar的Up/Home按钮做出反应
    case android.R.id.home:
        Intent upIntent = NavUtils.getParentActivityIntent(this);
        if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
            // 这个activity不是这个app任务的一部分, 所以当向上导航时创建
            // 用合成后退栈(synthesized back stack)创建一个新任务。
            TaskStackBuilder.create(this)
                    // 添加这个activity的所有父activity到后退栈中
                    .addNextIntentWithParentStack(upIntent)
                    // 向上导航到最近的一个父activity
                    .startActivities();
        } else {
            // 这个activity是这个app任务的一部分, 所以
            // 向上导航至逻辑父activity.
            NavUtils.navigateUpTo(this, upIntent);
        }
        return true;
    }
    return super.onOptionsItemSelected(item);
}

Note:为了能使addNextIntentWithParentStack()方法起作用,你必须像上面说的那样,在你的manifest文件中使用android:parentActivityName(和相应的<meta-data>元素)属性声明所有的activity的逻辑父activity。

程序提供向后兼容性

当C + +是第一个被创造出来,所有的文件在标准运行库结束。H。生活是一致的,它是好的。cout和cin的原始版本住在iostream。当语言是标准的ANSI委员会,他们决定把所有的功能在运行库在命名...
  • u013820713
  • u013820713
  • 2014年03月07日 17:16
  • 309

一分钟理解向后兼容

向后兼容 就是 向历史兼容,你理解对了吗?
  • linyt
  • linyt
  • 2016年11月27日 15:54
  • 4850

向前向后算法

本文出处:http://blog.csdn.net/xmu_jupiter/article/details/50956389 HMM简介 隐马尔可夫模型的参数一般称为其三要素,包括初始状态...
  • u013901685
  • u013901685
  • 2017年01月02日 16:18
  • 416

提供向上的导航

所有不是从主屏幕("home"屏幕)进入app的,都应该给用户提供一种方法,通过点击action bar中的Up按钮。可以回到app的结构层次中逻辑父屏幕。本课程向你说明如何正确地实现这一操作。 ...
  • lyglostangel
  • lyglostangel
  • 2015年11月20日 17:33
  • 255

向下兼容、向上兼容、向前兼容、向后兼容

简要辨析向下兼容、向上兼容、向前兼容、向后兼容四个概念之间的关联与联系。简言之,向上兼容等同于作向前兼容,向下兼容等同于向后兼容。主流使用的是向前兼容和向后兼容。向后兼容中“后”指“落后”,站在新版本...
  • wangxufa
  • wangxufa
  • 2017年06月02日 17:29
  • 553

有限差分法、一阶向前差分、一阶向后差分

有限差分法(FDM)的起源,讨论其在静电场求解中的应用.以铝电解槽物理模型为例,采用FDM对其场域进行离散,使用MATLAB和C求解了各节点的电位.由此,绘制了整个场域的等位线和电场强度矢量分布.同时...
  • yewei11
  • yewei11
  • 2014年10月21日 20:30
  • 7199

高德地图---路径规划---语音导航的开发

第一步导入高德地图导航开发包及对应的功能类第二步路径规划的类继承导航的接口Activity_NaviChoose extends Activity implements OnRouteSearchLi...
  • shuiermengqi
  • shuiermengqi
  • 2015年11月20日 13:46
  • 4261

一个简单的左侧导航栏滚动时悬浮效果

最近在做一个小项目的时候,遇到一个需要有左侧导航栏悬浮的效果,着实难为了一下,效果不难,只怪自己掌握的东西太少,后来经过努力,最终用一种比较粗糙的方式得以解决,实现的并不是太完美,但最终还是实现了,可...
  • wangxinyue001
  • wangxinyue001
  • 2015年08月05日 09:30
  • 4071

android提供的向上导航栏

参考:http://blog.csdn.net/aikongmeng/article/details/37934741  使用Android自带的返回操作 在AndroidManifest.xm...
  • hxltech
  • hxltech
  • 2016年06月27日 19:48
  • 730

相对定向--双像三维建模小软件开发实例(五)

相对定向
  • VisualMan_whu
  • VisualMan_whu
  • 2014年05月16日 16:17
  • 1729
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:提供向后的导航
举报原因:
原因补充:

(最多只允许输入30个字)