因為 Android Designer 認為任何非 main entrance 的 activity 都必須加入這個箭頭,讓 user 可以方便回到上一層,完全忽略大部分的 Android devices 有 back key,
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
沒有留言:
張貼留言