web-dev-qa-db-fra.com

IllegalStateException ("Vous ne pouvez pas définir OnCancelListener ou OnDismissListener de Dialog")

Cette implémentation de DialogFragment provoque une 

IllegalStateException ("Vous ne pouvez pas définir OnCancelListener ou OnDismissListener de Dialog")

. Pourquoi? Solution?

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");
    }
}
}

Mon activité implémente DialogInterface.OnCancelListener comme suit:

public class MainActivity extends Activity implements OkCancelDialogListener{

static final String TAG ="MainActivity";

@Override
public void onCancel(DialogInterface dialog) {


}
}

L'exception est lancée à partir de builder.create();. Qu'est-ce qui ne va pas?

35
user1709805

De la documentation Android:

public Dialog onCreateDialog (Bundle savedInstanceState) 

Remplacer pour créer votre propre conteneur de dialogue personnalisé. Ceci est Généralement utilisé pour montrer un AlertDialog au lieu d’un dialogue générique; prend soin de son propre contenu . 

Cette méthode sera appelée après onCreate (Bundle) et avant OnCreateView (LayoutInflater, ViewGroup, Bundle). L'implémentation Par défaut instancie et retourne simplement une classe Dialog.

Remarque: DialogFragment possède les rappels Dialog.setOnCancelListener et Dialog.setOnDismissListener. Vous ne devez pas les définir vous-même.

Pour en savoir plus sur ces événements, remplacez onCancel (DialogInterface) et OnDismiss (DialogInterface).

Donc, fondamentalement, vous devez remplacer onDismiss ou OnCancel au lieu de '.setOnCancelListener (onCancelListener)'.

85
marius bardan

Vous pouvez essayer ceci:

@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
}

J'espère que ça peut aider ...

6
Peter Tschudin

Vous définissez OnCancelListener pour une boîte de dialogue et non pour son générateur.

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