8

次の 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% 再現可能です。

これは明らかにひどいハックであり、おそらくデバイスの速度に依存する定数によってさらに悪化しています。

なぜこれが起こっているのか、そして/またはより良い解決策を提供しているのか知っている人はいますか? 私はこの問題に何時間も費やしましたが、これは私が思いつくことができる最高のものです.

4

2 に答える 2

4

これはAndroid4.2(ARMエミュレーターとGalaxy Nexus)で再現できます。x86 4.1エミュレーター、Nexus S(4.1)、およびMotorola RAZR i(4.0)での調査結果を再現できません。自分の本のサンプルの1つを変更することで、問題を再現することもできます。サンプルを使用して問題を提出しました:http ://code.google.com/p/android/issues/detail?id=41901問題の診断に役立つと思われるその他の情報を追加してください。

回避策に関しては、300msが機能する場合、それらの素敵な「タイミングの問題」の1つがあります。メニューを使用せずに表示する以外に、どのように回避するかについては、私にはわかりません。たとえば、サンプルアプリでは、適切SHOW_AS_ACTION_ALWAYSに動作させるには、単に切り替える(したがって、オーバーフローメニューではなくアクションバーの項目にする)だけで十分です。DialogFragmentうまくいけば、このバグを補うためにUIを調整する方法があるか、誰かが別の回避策を作成して、ここまたは問題について投稿するでしょう。

于 2012-12-25T19:39:30.487 に答える
2

ダイアログの呼び出し方法に関係なく、すべての一時停止でダイアログを破棄し、状態に応じて onResume で再作成することをお勧めします。そうしないと、アプリが一時停止中に OS によって強制終了された場合に、メモリ リークが発生する危険があります。

質問に明確に答えるには、アプリの状態を維持するために OS に依存しないでください。

于 2012-12-24T01:23:12.840 に答える