2

Android デベロッパーの皆さん、こんにちは。

私は 2 つの DialogFragments を連続させようとしているので、最初のものがキャンセルされると 2 番目のものがポップアップします。

これが私がこれまでに持っているものです:

私のアクティビティでは、次のメソッドを呼び出します。

void showFirstDialog() {
        // Pass the context to do a callback
        DialogFragment newFragment = ChangeDialogFragment.newInstance(mContext);
        newFragment.show(getSupportFragmentManager(), "myFirstDialogTag");
    }

私の DialogFragment には、キャンセルされることを検出する次のコードがあります。

@Override
    public void onCancel(DialogInterface dialog) {
            // Use Context to do a callback and inform the Activity that
            // Fragment is cancelled
        ((Activity) mContext).firstDialogCanceled();
        super.onCancel(dialog);
    }

アクティビティに戻り、2 番目のダイアログを開始して、そのイベントに対応します。

void firstDialogCanceled {
        DialogFragment newFragment = InformationDialogFragment.newInstance();
        newFragment.show(getSupportFragmentManager(), "mySecondDialogTag");
    }

最初のダイアログで向きを変更しない限り、これは完全に機能します。私が持っていると、次のエラーが表示されます。

java.lang.IllegalStateException: onSaveInstanceState の後にこのアクションを実行できません

この例外は、「newFragment.show(getSupportFragmentManager(), "mySecondDialogTag");」という行で発生します。

この問題を解決する方法を考えたのは、最初のダイアログを手動で閉じることです。私は次のことを試しました:

DialogFragment firstFragment = (DialogFragment) getSupportManager().findFragmentByTag("myFirstDialogTag");
firstFragment.dismiss();

ここでも、向きを変更することなく、すべてが正常に機能しています。最初のダイアログが画面に表示されているときに方向を変更すると、「firstFragment.dismiss()」行で NullPointerException が発生します。

なぜそれが起こっているのですか?FragmentManager が向きを変更した後に DialogFragment を忘れてしまうのはなぜですか。Androidリファレンスは次のように述べています。

show(FragmentManager, String) または show(FragmentTransaction, String) を使用して DialogFragment のインスタンスを UI に追加する必要があります。これらは、ダイアログが閉じられたときに DialogFragment が自身を削除する方法を追跡するためです。

私は show を使用していますが、まだ正しく動作していません。

どんなヒントでも大歓迎です!

乾杯 Ali3n

4

1 に答える 1

2

ダイアログフラグメントでアクティビティの古いインスタンスを使用しています。mContextメソッドのように現在のアクティビティを渡していると思いますnewInstance。向きやキーボードなどの構成変更後、このコンテキスト オブジェクトは無効になり、どのウィンドウにも関連付けられなくなります。

getActivity()のメソッドを使用FragmentDialogして、それが存在する現在のアクティビティを取得できます。

于 2011-12-24T20:06:59.990 に答える