【Interface&navigation】提供导航(64)

应用程序中不是应用程序主要入口的所有屏幕(“主页”屏幕)应该为用户提供一种方法,通过按操作栏中的向上按钮导航到应用程序层次结构中的逻辑父屏幕。本课程向您介绍如何正确实现此行为。

另请参阅设计后退和上导航, 任务和后台堆栈以及 Android设计:导航。

【Interface&navigation】提供导航(64)
图1.操作栏中的“ 向上”按钮。

指定父活动


要实现向上导航,第一步是声明哪个活动是每个活动的适当父级。这样做允许系统便于导航模式,例如Up,因为系统可以从清单文件中确定逻辑父活动。

从Android 4.1(API级别16)开始,您可以通过android:parentActivityName在<activity> 元素中指定属性来声明每个活动的逻辑父级。

如果您的应用支持Android 4.0及更低版本,请在 您的应用中添加支持库,并在其中添加<meta-data> 元素<activity>。然后将父活动指定为android.support.PARENT_ACTIVITY匹配android:parentActivityName属性的值。

例如:

<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>

与父活动宣告这种方式,你可以浏览最多 使用到适当的父NavUtils的API,如在下面的章节。

添加动作


要允许使用操作栏中的应用程序图标进行向上导航,请致电 setDisplayHomeAsUpEnabled():

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

这会在应用程序图标旁边添加一个向左的插入符号,并将其作为操作按钮启用,以便当用户按下该按钮时,您的活动会收到呼叫 onOptionsItemSelected()。该操作的ID是android.R.id.home。

导航到父活动


要在用户按下应用程序图标时向上导航,您可以使用NavUtils该类的静态方法 navigateUpFromSameTask()。当您调用此方法时,它将完成当前活动并启动(或恢复)相应的父活动。如果目标父活动位于任务的后台堆栈中,则会将其提前。它的提出方式取决于父活动是否能够处理onNewIntent()呼叫:

如果父活动具有启动模式<singleTop>或up意图包含FLAG_ACTIVITY_CLEAR_TOP,则父活动将被带到堆栈顶部,并通过其onNewIntent()方法接收意图 。
如果父活动具有启动模式<standard>,并且upintent不包含 FLAG_ACTIVITY_CLEAR_TOP,则从堆栈弹出父活动,并在堆栈顶部创建该活动的新实例以接收意图。

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

但是,使用navigateUpFromSameTask()适合只有当你的应用是当前任务的所有者(即,用户开始从您的应用程序这个任务)。如果这不是真的并且您的活动是在属于其他应用程序的任务中启动的,那么导航Up应创建属于您的应用程序的新任务,这需要您创建新的后备堆栈

使用新的后台堆栈进行导航

如果您的活动提供 了允许其他应用程序启动活动的任何意图过滤器,您应该实现onOptionsItemSelected()回调,以便在用户从其他应用程序的任务输入活动后按下向上按钮时,您的应用程序将使用相应的后台堆栈启动新任务在航行之前。

您可以通过首先调用 shouldUpRecreateTask()以检查当前活动实例是否存在于其他应用程序的任务中来执行此操作。如果返回true,则使用生成新任务TaskStackBuilder。否则,您可以使用navigateUpFromSameTask()上面显示的方法。

例如:

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

注意:为了使addNextIntentWithParentStack() 方法起作用,您必须使用如上所述的android:parentActivityName属性(和相应的<meta-data>元素)声明清单文件中每个活动的逻辑父级 。

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Interface&navigation】提供导航(64)

猜你喜欢

转载自blog.51cto.com/4789781/2178010