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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章