5

シンプルであるはずDialogFragmentの がありますが、特に Jelly Bean でいくつかの大きな問題が発生しています。

アプリはネットワークを使用し、ユーザーに WiFi をオンにするかキャンセルするかを尋ねるダイアログを表示してから閉じます。したがって、次のようにビューを拡張DialogFragmentして作成します。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    AlertDialog a = new AlertDialog.Builder(getActivity()).setCancelable(true).setTitle(R.string.dialog_title_disabled)
            .setMessage(R.string.dialog_text)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        dismiss();
                        Intent i = new Intent(Settings.ACTION_WIRELESS_SETTINGS);
                        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(i);
                    }
            }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        getActivity().finish();
                    }
            }).create();
    //a.setCanceledOnTouchOutside(false);
    return a;
}

ユーザーが [はい] をクリックすると、ダイアログが閉じられ、ワイヤレス設定アクティビティが開きます。または、ユーザーが [キャンセル] をクリックすると、アクティビティ全体が閉じられますが、Jelly Bean では、[はい] をクリックするたびに設定が開きますが、アプリは次のエラーで強制的に閉じられます。

08-05 20:24:22.584: E/AndroidRuntime(2579): java.lang.IllegalStateException: Failure saving state: active SettingsDialogFragment{425dd550} has cleared index: -1
08-05 20:24:22.584: E/AndroidRuntime(2579):     at android.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1653)

私のレイアウトにあった各フラグメントの保存された状態を示すいくつかの追加のログがあり、番号 2 であるはずだったのSettingsDialogFragmentは単なるnull:

08-05 20:24:22.576: E/FragmentManager(2579):     #2: null

ダイアログを閉じないようにしましたが、同じようにクラッシュしました。

ここで何が起こっているのかよくわかりません…何かアイデアはありますか?


編集:

アクティビティ コード (アプリは ICS 以上を対象としているため、通常のアクティビティです):

private void showDialog() {
    SettingsDialogFragment diag = (SettingsDialogFragment) getFragmentManager().findFragmentByTag(DIALOG_TAG);
    if (diag == null) {
        diag = new SettingsDialogFragment();
        diag.show(getFragmentManager(), DIALOG_TAG);
    } else {
        if (!diag.isVisible())
            diag.show(getFragmentManager(), DIALOG_TAG);
    }
}

private void dismissDialog() {
    SettingsDialogFragment diag = (SettingsDialogFragment) getFragmentManager().findFragmentByTag(DIALOG_TAG);
    if (diag != null)
        diag.dismiss();
}
4

1 に答える 1

7

どうやらGoogleは何かをICSからJBに変更し、私が使用しなければならなかった対話を却下したようです。

dismiss();
getFragmentManager().beginTransaction().remove(frag).commit();

dialogFragmentは、以前のようにフラグメントマネージャーのOnDismissから自分自身を削除していないようです。誰かがソースコードを掘り下げてコミュニティを再確認したいのであれば、それはすばらしいことです。

ありがとう。

于 2012-08-06T13:46:33.390 に答える