親アクティビティを指定せずに作成したアクティビティに親を設定する
support.NavUtils を使う場合(正攻法?)
manifest の当該 activity 要素に meta-data 要素を追加する。
value は親にしたい(ナビゲーションバーのホーム押下時の戻り先)アクティビティのクラス名。
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value="*親アクティビティの完全修飾クラス名*" />
onCreate() に、アクションバーのホーム押下を有効にする記述を追加。
@Override public void onCreate() { ... getActionBar().setDisplayHomeAsUpEnabled(true);
onOptionsItemSelected() を追加(あるいは android.R.id.home のアクションを追加)。
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); }
NavUtils を使わない方法
onCreate() に、アクションバーのホーム押下を有効にする記述を追加。
@Override public void onCreate() { ... getActionBar().setDisplayHomeAsUpEnabled(true);
onOptionsItemSelected() を追加(あるいは android.R.id.home のアクションを追加)。
下記コード中 xxx.class の xxx は、起動したいクラスの完全修飾名。
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: startActivity(new Intent(this, xxx.class)); finish(); return true; } return super.onOptionsItemSelected(item); }
AndroidManifest.xml の変更は不要。
補足: activity 要素に定義したメタデータの読み取り
マニフェストの activity 要素に追加した meta-data は ActivityInfo.metadata 経由でアクセスできる。
<manifest ...> ... <activity android:name=".hoge"> <meta-data android:name="key" android:value="value" /> ...
final ComponentName comp = getComponentName(); final ActivityInfo info = getPackageManager().getActivityInfo(comp, PackageManager.GET_META_DATA); final String value = info.metadata.getString("key");
support.v4 定義の NavUtils は NavUtils.PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY" のメタデータに従って遷移先を決めているのだろう。
なお JellyBean 以降は activity マニフェストの属性に android:parentActivityName が追加されており、 getParentActivityIntent() はこちらを PARENT_ACTIVITY より優先するとか。