次の 2 つの方法のいずれかを表示できる DialogDragment があります。
1) OnItemClickListener から ListView 項目をタップする
2) ListView のコンテキスト メニューをアクティブにし、メニュー項目を選択する
#1 を実行すると、すべてのライフサイクル イベントで正常に動作しますが、#2 を介して呼び出し、(ホームに戻ることによって) アクティビティを一時停止し、タスク スイッチャーを介して再開すると、ダイアログが表示されなくなります。フラグメントがそこにあるので、デバイスを回転させてダイアログを表示できます。
私は実験しましたが、少なくとも 1/2 秒の遅延で DialogFragment の表示を Handler に入れると、動作します。
次のスニペットは失敗します。ダイアログは表示されますが、一時停止/再開によって非表示になります。
public boolean onContextItemSelected(android.view.MenuItem item) {
boolean consumed = false;
switch (item.getItemId()) {
case R.id.menu_item:
showMyDialogFragment();
consumed = true;
break;
}
return consumed;
}
したがって、次のスニペットが機能します。一時停止/再開すると、ダイアログが再び正しく表示されます。
public boolean onContextItemSelected(android.view.MenuItem item) {
boolean consumed = false;
switch (item.getItemId()) {
case R.id.menu_item:
new Handler().postDelayed(new Runnable() {
public void run() {
showMyDialogFragment();
}
}, 300);
consumed = true;
break;
}
return consumed;
}
300 ミリ秒の遅延を 0 ミリ秒または 250 ミリ秒の遅延に置き換えると、再び壊れます。これは 100% 再現可能です。
これは明らかにひどいハックであり、おそらくデバイスの速度に依存する定数によってさらに悪化しています。
なぜこれが起こっているのか、そして/またはより良い解決策を提供しているのか知っている人はいますか? 私はこの問題に何時間も費やしましたが、これは私が思いつくことができる最高のものです.