我正在尝试根据 Android 设计指南 ( http://developer.android.com/design/patterns/navigation.html ) 实现 ActionBar UP 导航。
对于大多数用例来说,这很简单,但假设我有一个名为 Activity2A 的 Activity,我可以通过 2 条不同的路径到达:
MainActivity -> Activity1A -> Activity2A
MainActivity -> Activity1B -> Activity2A
Activity2A 的逻辑父级是 Activity1A,因此应该在从 Activity2A 向上导航时启动。我根据官方教程在清单中设置了这个:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Sherlock.Light" >
<!-- Main menu -->
<activity
android:name="hu.scythe.upnavigation.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Level 1 -->
<activity
android:name="hu.scythe.upnavigation.Activity1A"
android:label="@string/title_activity_activity1"
android:parentActivityName="hu.scythe.upnavigation.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="hu.scythe.upnavigation.MainActivity" />
</activity>
<activity
android:name="hu.scythe.upnavigation.Activity1B"
android:label="@string/title_activity_activity1_b"
android:parentActivityName="hu.scythe.upnavigation.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="hu.scythe.upnavigation.MainActivity" />
</activity>
<!-- Level 2 -->
<activity
android:name="hu.scythe.upnavigation.Activity2A"
android:label="@string/title_activity_activity2"
android:parentActivityName="hu.scythe.upnavigation.Activity1A" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="hu.scythe.upnavigation.Activity1A" />
</activity>
</application>
我在 Activity2A 中使用以下代码进行向上导航:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
// This activity is NOT part of this app's task, so create a new
// task
// when navigating up, with a synthesized back stack.
TaskStackBuilder.create(this)
// Add all of this activity's parents to the back stack
.addNextIntentWithParentStack(upIntent)
// Navigate up to the closest parent
.startActivities();
} else {
// This activity is part of this app's task, so simply
// navigate up to the logical parent activity.
NavUtils.navigateUpTo(this, upIntent);
}
return true;
}
return super.onOptionsItemSelected(item);
}
如果我在第一条路径上导航到 Activity2A,它工作正常(所以它的逻辑父级已经在 Activity 堆栈上)。但是使用第二条路径,单击 UP 按钮会将我带到 MainActivity(根),而不是 Activity1A(逻辑父)。我正在 Android 4.2 上测试此代码。
我究竟做错了什么?