关闭

[Android] 使用ActionBar的Up导航的简介及一个疑问

标签: android
2423人阅读 评论(1) 收藏 举报

Up,返回该app的逻辑层级的上一层,即parentActivity。

Back,返回back stack的上一个activity。

使用Up导航的方法:

在Android 4.1上,只需要声明该activity的parentActivity即可。

在Android 4.0及之前的版本上,需要include Support Library,然后添加相应的<meta-data>。

示例:

1. AndroidManifest.xml:

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

2. 启用ActionBar导航,实际测试不用这段代码也行

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

3.1 当该app是当前task的owner时,可以使用NavUtils.navigateUpFromSameTask()

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

3.2 如果这个activity可以由其它的app启动,则必须判断是否需要重建back stack, 见代码:

@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);
}

一般使用3.1即可,不用3.2.

现在有点奇怪的:

使用Up返回的parentActivity没有自动恢复状态,而使用Back返回的activity(刚好是parentActivity的时候),就会恢复状态。很奇怪,Google官方应该不是这样设计的,否则开发者都倾向于使用Back了。留待以后解决。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12468次
    • 积分:257
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    最新评论