マスター/詳細レイアウト (1 つのアクティビティ、1 つの ListView フラグメント、1 つの詳細フラグメント) のアプリがあります。ユーザーが ListView 内のアイテムをクリックすると、フラグメント トランザクションによって、そのアイテムに対応する情報を含む詳細フラグメントが右側のペインにインスタンス化されます。詳細フラグメントが表示されると、最初のアクション バー ボタン/アイテムが非表示になり、3 つの新しい AB アイテム (完了/削除/キャンセル) が表示されます。ユーザーは、戻るボタンを押すか、3 つの AB 項目のいずれかを押すことで、右ペインを消去して初期 UI 状態に戻ることができます。
私が経験している問題は、ユーザーがアプリのホーム アイコン (つまり、「上へのナビゲーション」) を選択すると、アクティビティが再読み込みされることです (つまり、アクティビティが開始されたことを示すアニメーションが、アクション バーとUIが再描画されました)。この問題は、アプリのホーム アイコンが押されたときにのみ発生します。ユーザーが戻るボタンまたはキャンセル/完了/削除アクション バー ボタンを押すと、フラグメントは右ペインから単純に削除され、UI は「再読み込み」せずに初期状態に戻ります。
アクティビティの XML レイアウトは次のとおりです (LinearLayout 内では、prettify によってその行が非表示になっています)。
<fragment class="*.*.*.ListFragment"
android:id="@+id/titles" android:layout_weight="1"
android:layout_width="0px"
android:layout_height="match_parent" />
<FrameLayout android:id="@+id/details" android:layout_weight="2"
android:layout_width="0px"
android:layout_height="match_parent" />
DetailsFragement の onCreate メソッドには、actionBar.setDisplayHomeAsUpEnabled ステートメントがあります。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
ActionBar actionBar = getSherlockActivity().getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}
ListView フラグメントと Detail フラグメントの両方で、フラグメント内に onCreateOptionsMenu() および onOptionsItemSelected() メソッドが実装されています。詳細フラグメントのコードの下:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.edit_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// some variable statements...
switch (item.getItemId()) {
case android.R.id.home:
//Toast.makeText(getSherlockActivity(), "Tapped home", Toast.LENGTH_SHORT).show();
onHomeSelectedListener.onHomeSelected();
return true;
case R.id.menu_edit_item_done:
editedTask.setTitle(editedTaskTitle);
onTaskEditedListener.onTaskEdited(editedTask, UPDATE_TASK, true);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
ホスト アクティビティでは、onHomeSelectedListner を実装して、アプリのホーム アイコンの押下を処理します (つまり、「上へのナビゲーション」:
public void onHomeSelected(){
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
TaskFragment taskFragment = (TaskFragment)getSupportFragmentManager().findFragmentById(R.id.details);
ft.remove(taskFragment);
ft.commit();
manager.popBackStack();
}
他のすべてのアクション バー ボタン (つまり、完了/削除/キャンセル) の処理を担当するアクティビティのリスナーは onTaskEditedListener であり、いくつかのデータを処理する他のコードは別として、上記と同じフラグメント トランザクションがあります。
更新(1/24) tyczj と straya のフィードバックに基づいて、アクティビティの onCreate()、onResume()、onPause() 内にログ ステートメントを配置して、onHomeSelected リスナーと onTaskEdited リスナーの違いを判断しました。「アップ ナビゲーション」イベント (つまり onHomeSelected) 中に onPause()、onCreate()、および onResume() が呼び出されることを確認できます。一方、onTaskEdited 呼び出し中 (つまり、戻るボタンまたは完了/削除/キャンセル プレス) では、これらのイベントは呼び出されません。
更新 (1/25) Mark Murphy の提案に基づいて、「case android.R.id.home」ステートメントの onHomeSelected メソッド呼び出しをコメントアウトして、Activity が何をするかを確認しました。ステートメントがないため、アプリは何もしないという考えでした。そうではないことがわかりました。リスナー メソッドを呼び出さなくても (つまり、フラグメントを削除する)、アクティビティが再開され、詳細フラグメントがフラグメント コンテナーから削除されます。
更新 (2/28) ウィンドウアニメーションを無効にすることで、メインアクティビティが再開されたという事実を一時的に回避します(私自身の回答で強調表示されています)。しかし、さらなるテストを通じて、バグを発見しました。Wolfram Rittmeyer のサンプル コードのおかげで、アップ ナビゲーション中に (マスター/詳細の単一レイアウトで) アクティビティが再開された本当の理由を突き止めることができました。バックスタックから、ホスティング アクティビティを開始する新しいインテントを作成していた ListView フラグメントの onOptionsItemSelected に、まだいくつかのコードが残っていました。そのため、アプリのホーム アイコンを押すと、アクティビティが再開されていました。2)私の最終的な実装(私自身の回答に示されています)では、