2015年7月19日 星期日

[擒猿筆記篇] Android 在 Activity 中實作 Up Navigation

你一定看過以下最左邊這個 Up Navigation 的箭頭:



因為 Android Designer 認為任何非 main entrance 的 activity 都必須加入這個箭頭,讓 user 可以方便回到上一層,完全忽略大部分的 Android devices 有 back key,幹你娘自以為是 iphone 。

Up Navigation 的實作方式如下:

1. 在 Manifest 中 activity 的欄位添加以下屬性:
<!-- Parent activity to support 4.1 and higher -->
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" />

2. 在 onCreate() 中加入以下程式片斷後,在 Action bar 上就會出現一個可按的箭頭了:
@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    // 隱藏 Logo 只顯示箭頭
    getActionBar().setDisplayHomeAsUpEnabled(true);

    // 顯示 Logo 也顯示箭頭
    getActionBar().setLogo(R.drawable.myDrawable);
    getActionBar().setDisplayUseLogoEnabled(true);
    getActionBar().setDisplayShowHomeEnabled(true);
}

3. 還需要實作 onOptionsItemSelected() 讓箭頭按下去之後會有反應:
@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);
}
其中 NavUtils 是 android support library v4 的 class,使用前必需載入 android-support-v4.jar 這個外部 jar 檔。


4. 如果該 Activty 是可接受外部 intent 呼叫的,則可透過以下方式實作 Up Navigation,使其再點選箭頭後回到外部程式:
@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);
}
注意,使用此方法時必須在  Manifest 中宣告 android:parentActivityName 和其對應的 <meata-data> 屬性。

refs: http://developer.android.com/training/implementing-navigation/ancestral.html

沒有留言:

張貼留言