Roger Garzon Nietoとsohailaziz の回答を組み合わせて使用しました。私のアプリには、単一の MainActivity と、それに読み込まれるフラグメント A、B、C があります。私の「ホーム」フラグメント (A) は OnBackStackChangedListener を実装し、backStack のサイズをチェックします。1 未満の場合は、UP ボタンを非表示にします。フラグメント B と C は常に戻るボタンをロードします (私の設計では、B は A から起動され、C は B から起動されます)。MainActivity 自体は、UP ボタンのタップ時にバックスタックをポップするだけで、フラグメントが呼び出すボタンを表示/非表示にするメソッドがあります。
主な活動:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
getSupportFragmentManager().popBackStack();
return true;
}
return super.onOptionsItemSelected(item);
}
public void showUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
public void hideUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(false); }
fragmentA (FragmentManager.OnBackStackChangedListener を実装):
public void onCreate(Bundle savedinstanceSate) {
// listen to backstack changes
getActivity().getSupportFragmentManager().addOnBackStackChangedListener(this);
// other fragment init stuff
...
}
public void onBackStackChanged() {
// enable Up button only if there are entries on the backstack
if(getActivity().getSupportFragmentManager().getBackStackEntryCount() < 1) {
((MainActivity)getActivity()).hideUpButton();
}
}
フラグメント B、フラグメント C:
public void onCreate(Bundle savedinstanceSate) {
// show the UP button
((MainActivity)getActivity()).showUpButton();
// other fragment init stuff
...
}