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

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了。留待以后解决。

阅读更多
文章标签: android
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭