0

show() および add() メソッドを使用して、アクティビティにダイアログ フラグメントを表示しています。コードを以下に示します

HelpDialogFragment hdf = HelpDialogFragment.newInstance();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(hdf, "dialog");
ft.commit(); #crash here

上記のコードから IllegalStateException エラーが発生することがあります。クラッシュ ログを以下に示します。

java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1329)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:532)
at com.delight.activities.HomeActivity.showHelp(HomeActivity.java:311)

行番号 HomeActivity.java の 311 はft.commit()、上記のコードで言及されています。私のアクティビティは、FragmentActivity を互換性ライブラリ (これは最新の状態に更新されています) から拡張します。メソッドを使用すると、同じクラッシュが発生しますshow()

HelpDialogFragment hdf = HelpDialogFragment.newInstance();
hdf.show(getSupportFragmentManager(), "dialog");  #same crash here

だから私は問題を引き起こしているという結論に達しgetSupportFragmentManager()ました。私が理解していないのは、コードのどの部分で破壊されたアクティビティを使用しているのかということです。私が理解している限りgetSupportFragmentManager()、存在する活動。

この問題を解決するには、助けが必要です。

4

3 に答える 3

0

ダイアログ フラグメントについては、dialogfrag.show(Fmanager,tag); を呼び出すだけで済みます。トランザクションを介して追加すると例外が発生します

于 2012-07-23T12:49:23.207 に答える
0

getSupportFragmentManager の代わりに getFragmentManager を使用する

dialog.show(getFragmentManager(), "submitting"); // The second parameter doesn't really matter.

それが機能しない場合は、DialogFragment を拡張してそれを実行します。重要なのは、サポート ライブラリを使用する代わりに、ダイアログを作成するときにアクティビティを使用することです。

dialog = new AlertDialogFragment(title, message);
dialog.show(getFragmentManager(), "submitting");

AlertDialogFragment:

    public class AlertDialogFragment extends DialogFragment {

        static final String TAG_TITLE = "title";
        static final String TAG_MSG = "message";

        public AlertDialogFragment(){

        }

        public AlertDialogFragment(String title, String message) {
            Bundle b = new Bundle();
            b.putString(TAG_TITLE, title);
            b.putString(TAG_MSG, message);

            setArguments(b);
        }

        public AlertDialogFragment newInstance(String title, String message) {
            AlertDialogFragment frag = new AlertDialogFragment();
            Bundle b = new Bundle();
            b.putString(TAG_TITLE, title);
            b.putString(TAG_MSG, message);

            frag.setArguments(b);
            return frag;
        }

        public Dialog onCreateDialog(Bundle savedInstanceState) {
            String title = getArguments().getString(TAG_TITLE);
            String message = getArguments().getString(TAG_MSG);
                // Use getActivity()!
            return new AlertDialog.Builder(getActivity()).setTitle(title)
                    .setMessage(message)
                    .setNegativeButton("Dismiss", new OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dismiss();
                        }
                    })
                    .setOnCancelListener(new OnCancelListener() {

                        @Override
                        public void onCancel(DialogInterface dialog) {
                            Log.d(TAG, "Dialog cancel");
                        }
                    }).create();
        }

        @Override
        public void onCancel(DialogInterface dialog) {
            Log.d(TAG, "Cancel Dialog");
            super.onCancel(dialog);
        }

        @Override
        public void onDismiss(DialogInterface dialog) {
            Log.d(TAG, "Dismiss Dialog");
            super.onDismiss(dialog);
        }
    }

}
于 2012-07-23T13:00:28.390 に答える
0

クラスは、Activity ではなく FragmentActivity を拡張する必要があります。これで問題は解決しました

于 2013-04-15T14:10:46.750 に答える