web-dev-qa-db-ja.com

IllegalStateException( "ダイアログのOnCancelListenerまたはOnDismissListenerを設定できません")

このDialogFragmentの実装により、

IllegalStateException( "ダイアログのOnCancelListenerまたはOnDismissListenerを設定できません")

。どうして?解決?

_public class OkCThreadDialog1 extends DialogFragment{

DialogInterface.OnCancelListener onCancelListener;

public OkCThreadDialog1(){
}

public static OkCThreadDialog1 newInstance(String title, String message) {
    OkCThreadDialog1 frag = new OkCThreadDialog1();
    Bundle args = new Bundle();
    args.putString("title", title);
    args.putString("message", message);
    frag.setArguments(args);
    return frag;
}


public Dialog onCreateDialog(Bundle savedInstanceState){

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());


    builder .setTitle(getArguments().getString("title"))
            .setMessage(getArguments().getString("message"))
            .setOnCancelListener(onCancelListener)
            .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }})
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    getDialog().cancel();
                }});

    return builder.create();
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // Verify that the Host activity implements the callback interface
    try {
        onCancelListener = (DialogInterface.OnCancelListener) activity;
    } catch (ClassCastException e) {
        // The activity doesn't implement the interface, throw exception
        throw new ClassCastException(activity.toString()
                + " must implement OkCancelDialogListener");
    }
}
}
_

私のアクティビティは、次のように_DialogInterface.OnCancelListener_を実装します。

_public class MainActivity extends Activity implements OkCancelDialogListener{

static final String TAG ="MainActivity";

@Override
public void onCancel(DialogInterface dialog) {


}
}
_

例外はbuilder.create();からスローされます。どうしましたか?

35
user1709805

から Androidドキュメント

public Dialog onCreateDialog(Bundle savedInstanceState)

オーバーライドして、独自のカスタムダイアログコンテナを作成します。これは通常、一般的なダイアログの代わりにAlertDialogを表示するために使用されます。その場合、AlertDialogが独自のコンテンツを処理するため、onCreateView(LayoutInflater、ViewGroup、Bundle)を実装する必要はありません。

このメソッドは、onCreate(Bundle)の後、onCreateView(LayoutInflater、ViewGroup、Bundle)の前に呼び出されます。デフォルトの実装では、Dialogクラスをインスタンス化して返します。

注:DialogFragmentは、Dialog.setOnCancelListenerおよびDialog.setOnDismissListenerコールバックを所有します。自分で設定してはいけません。

これらのイベントについて調べるには、onCancel(DialogInterface)およびonDismiss(DialogInterface)をオーバーライドします。

したがって、基本的には、「。setOnCancelListener(onCancelListener)」の代わりにonDismissまたはOnCancelをオーバーライドする必要があります。

87
marius bardan

あなたはこれを試すことができます:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Title");
    builder.setMessage("Message");
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // do something positive
        }
    });
    return builder.create();
}

@Override
public void onCancel(DialogInterface dialog) {
    // do something
}

それが役立つことを願っています...

6
Peter Tschudin

ビルダーではなくダイアログにOnCancelListenerを設定します。

public Dialog onCreateDialog(Bundle savedInstanceState){

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder .setTitle(getArguments().getString("title"))
        .setMessage(getArguments().getString("message"))
        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }})
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                getDialog().cancel();
            }});

    Dialog dialog = builder.create();
    dialog.setOnCancelListener(onCancelListener);
    return dialog;
}
0
Ziteng Chen