0

互換性ライブラリを使用してコードを Honeycomb に移植しています。事前に移植されたコードは次のように機能します。アクティビティ A、B、およびダイアログ D1 と D2 があります。B には、別の場所からメッセージを受信するメッセージ ハンドラーがあります。

A は B を呼び出し、B はメッセージ (1) で showDialog を呼び出して D1 を表示します。メッセージ (2) で、ユーザーがまだ D1 を閉じていない場合は、次のコードを使用して閉じられ、D2 が表示されます。

if (D1.isShowing()) {
    D1.dismiss();
}

これはうまくいきます。

移植したコードでは、A が Fragment、FB (メッセージ ハンドラを含む) をロードし、D1 と D2 が DialogFragment から派生するようになりました。以下を使用してダイアログが表示されるようにコードを変更しました。

dlg.show(fragmentManager, tag);

上記のチェックは次の方法で実行されます。

if (D1.isVisible()) {
    D1.dismiss();
}

ただし、これは機能しません。何が起こるかというと、最初に D2 が表示され、次に閉じられると D1 が表示されます。これは、上記のチェックが行われたときに D1 が表示されず、D2 がスタックの一番上に追加されるため、最初に表示されるためだと思います (D2 の onCreateView は D1 の前に呼び出されます)。

今、私は無駄にさまざまなことを試しました:

1) トランザクション マネージャーを取得し、D1 がスタック上にあるかどうかを確認して、可視性を確認します。2) 以下を使用してダイアログを表示します。

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(0, dlg);
ft.commit();            

または追加の代わりに置換/削除を使用する

3) 可視性をチェックするときは、次のことを行います。

FragmentManager fm = fragment.getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fragment.D1tag).ft.commit();          

現在、3) は、特定の状況 (ダイアログを早期に閉じるなど) でフラグメントが見つからないために、そうでない場合と illegalStateException がスローされる場合を除いて、ある種の作業を行います。

これをどのように修正できるか、または実際にこれについて完全に間違った方法で考えているかどうか、おそらくアクティビティがダイアログのライフサイクルを制御する必要があるかどうかについてのアイデアはありますか? ハニカム前のアプリのアクティビティ B は、FB をロードするラッパー アクティビティになっているため、A と B の両方でライフサイクル管理コードを複製したくないことに注意してください。

前もって感謝します。ピーター。

4

1 に答える 1

0

いくつかの行き止まりの後、私は最終的に、メッセージをフラグメントのメッセージハンドラーに投稿するために、メッセージハンドラーに以下を実装し、「show(...)」を使用して、必要な機能を取得することができました。すべてのダイアログを表示します。

new Handler().post(new Runnable() {
    public void run() {
        FragmentManager fm = fragment.getFragmentManager();
        DialogFragment fd = (DialogFragment) fm.findFragmentByTag(d1Tag);
        if (fd != null) {
            fm.beginTransaction().remove(fd).commit();
        }
    }
});
于 2011-05-09T09:09:58.190 に答える