删除活动并将活动添加到后台堆栈

时间:2013-11-27 11:43:48

标签: android navigation-drawer

Navigation Drawer的“交叉导航到较低层次结构级别后的系统返回”部分中,他们说:

  

如果用户从导航导航到较低层次的屏幕   抽屉和屏幕有一个直接的父,然后Back堆栈   reset和Back指向目标屏幕的父级。这回来了   行为与用户从a导航到应用程序时的行为相同   通知。

resetting the back stack

我知道可以通过使用FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK启动活动来重置后台堆栈,但这似乎在这里不可用,因为它不会为Lower 1.1.1创建后台堆栈。

知道如何从堆栈中删除TopView2并同时添加TopView1 - >启动低1.1.1时降低1.1后堆栈?考虑到导航抽屉文档中提到的这一点,我期待一个简单的解决方案。

1 个答案:

答案 0 :(得分:55)

编辑合成版本:

1)在清单文件中声明应用的分层导航结构。

2)应用的根活动应在应用层次结构中的 TopViews 之间执行视图切换。*

3)层次结构中较低的活动应执行“选择性向上”导航。

* 重要提示:当交易用于水平导航时,例如切换标签页或导航抽屉顶视图时,不应将事务添加到后台堆栈。


完整描述:

出于以下原因,你应该避免使用Intent Flags 和导航抽屉等新的导航模式:

  • Intent Flags实际上并不是一个API。
  • 某些标志仅适用于精确组合。
  • 许多标记与大多数第三方应用无关。
  • 与活动launchMode重叠/冲突。
  • 令人困惑的文件。
  • 实施可以成为一个反复试验的过程。

相反,请选择新的导航API:

  • Jelly Bean及以上版本的本地向导。
  • 基于清单中为每个<activity>指定的分层元数据。
  • 支持库通过NavUtils为早期的Android版本提供了相同的功能。
  • TaskStackBuilder为跨任务导航提供了其他实用程序。

所以回答你的问题的一般想法是:

1)您需要使用android:parentActivityName属性(和相应的<meta-data>元素)声明清单文件中每个活动的逻辑父级,如:

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myapp.RootDrawerActivity" ...>
        ...
    </activity>
    <!-- A child of the root activity -->
    <activity
        android:name="com.example.myapp.Lower11 "
        android:label="@string/lower11"
        android:parentActivityName="com.example.myapp.RootDrawerActivity" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myapp.RootDrawerActivity" />
    </activity>
    <activity
        android:name="com.example.myapp.Lower111 "
        android:label="@string/lower111"
        android:parentActivityName="com.example.myapp.Lower11" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myapp.Lower11" />
    </activity>
</application>

2)在您的根活动中,抽屉项目选择应通过替换活动的当前片段内容来启动“查看切换”操作。

视图切换遵循与列表或标签导航相同的基本策略,因为视图切换不会创建导航历史记录。 此模式应仅用于任务的根活动,使某种形式的向上导航对导航层次结构中的活动保持活动状态(在您的情况下为低1.1和低1.1.1)。这里重要的是你不需要从堆栈中删除TopView2,而是在将视图(或片段id)的位置作为额外的位置传递之前执行视图切换。

在你的root Activity中做这样的事情:

@Override
protected void onDrawerItemSelected(int position) {

        // Update the main content by replacing fragments
        CategoryFragment fragment = new CategoryFragment();
        Bundle args = new Bundle();
        args.putInt(RootDrawerActivity.ARG_SORT, position);
        fragment.setArguments(args);

        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                        .replace(R.id.content_frame, fragment).commit();

        // Update selected item and title, then close the drawer
        setDrawerItemChecked(position, true);
        setTitle(getResources().getStringArray(R.array.drawer_array)[position]);
        closeDrawer();

}

3)然后在层次结构中降低(即Lower1.1),您应该执行“选择性向上”导航,在过程中重新创建任务堆栈

选择性向上允许用户随意跳过应用程序的导航层次结构。应用程序应该对此进行处理,因为它使用TaskStackBuilder或类似工具来处理来自其他任务的导航,替换当前任务堆栈(这是您想要的!)。这是导航抽屉的唯一形式,应该在任务的根活动之外使用。

@Override
protected void onDrawerItemSelected(int position) {

        TaskStackBuilder.create(this)
                        .addParentStack(RootDrawerActivity.class)
                        .addNextIntent(new Intent(this, RootDrawerActivity.class)
                                        .putExtra(RootDrawerActivity.ARG_SORT, position))
                        .startActivities();

}

参考文献:

http://developer.android.com/training/implementing-navigation/ancestral.html https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android