在Navigation Drawer的“交叉导航到较低层次结构级别后的系统返回”部分中,他们说:
如果用户从导航导航到较低层次的屏幕 抽屉和屏幕有一个直接的父,然后Back堆栈 reset和Back指向目标屏幕的父级。这回来了 行为与用户从a导航到应用程序时的行为相同 通知。
我知道可以通过使用FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK启动活动来重置后台堆栈,但这似乎在这里不可用,因为它不会为Lower 1.1.1创建后台堆栈。
知道如何从堆栈中删除TopView2并同时添加TopView1 - >启动低1.1.1时降低1.1后堆栈?考虑到导航抽屉文档中提到的这一点,我期待一个简单的解决方案。
答案 0 :(得分:55)
编辑合成版本:
1)在清单文件中声明应用的分层导航结构。
2)应用的根活动应在应用层次结构中的 TopViews 之间执行视图切换。*
3)层次结构中较低的活动应执行“选择性向上”导航。
* 重要提示:当交易用于水平导航时,例如切换标签页或导航抽屉顶视图时,不应将事务添加到后台堆栈。
完整描述:
出于以下原因,你应该避免使用Intent Flags 和导航抽屉等新的导航模式:
launchMode
重叠/冲突。相反,请选择新的导航API:
<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