2013-01-25 10 views
33

Questa implementazione DialogFragment causa unIllegalStateException ("Non è possibile impostare OnCancelListener del dialogo o OnDismissListener")

IllegalStateException ("Non si può impostare OnCancelListener del dialogo o OnDismissListener")

. Perché? Soluzione?

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

La mia attività implementa DialogInterface.OnCancelListener come segue:

public class MainActivity extends Activity implements OkCancelDialogListener{ 

static final String TAG ="MainActivity"; 

@Override 
public void onCancel(DialogInterface dialog) { 


} 
} 

Exeception è gettato dal builder.create();. Cosa c'è che non va?

risposta

84

Da documentazione Android:

pubblico Dialog onCreateDialog (Bundle savedInstanceState)

Override di costruire la vostra proprio contenitore di dialogo personalizzato. Questo è in genere utilizzato per mostrare un AlertDialog anziché una finestra di dialogo generica; in tal caso, onCreateView (LayoutInflater, ViewGroup, Bundle) non ha bisogno di essere implementato dal momento che AlertDialog si prende cura del proprio contenuto .

Questo metodo verrà chiamato dopo onCreate (Bundle) e prima di onCreateView (LayoutInflater, ViewGroup, Bundle). L'implementazione predefinita crea un'istanza e restituisce una classe di dialogo.

Nota: DialogFragment possiede i callback Dialog.setOnCancelListener e Dialog.setOnDismissListener. Non devi metterli da solo.

per scoprire questi eventi, override onCancel (DialogInterface) e onDismiss (DialogInterface).

Quindi, fondamentalmente, è necessario eseguire l'override del onDismiss o OnCancel invece di '.setOnCancelListener (onCancelListener)'.

+1

Grazie per questo. Questa dovrebbe essere la risposta accettata. –

0

Si imposta OnCancelListener per una finestra di dialogo non per il relativo builder.

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; 
} 
+2

appena provato .. non è così funziona comunque! – user1709805

+0

Non funziona neanche per me. Ho appena usato la soluzione nella risposta accettata. – Micer

-3

Prova questo codice Spero che questo sarà il lavoro ..

AlertDialog.Builder builder = new AlertDialog.Builder(
      class_name.this); 
    builder.setTitle("Title");  
    AlertDialog dialog = builder.create(); 
    dialog.setButton("ok", new DialogInterface.OnClickListener() { 

     public void onClick(DialogInterface dialog, int which) {    

    }); 


    dialog.setButton2("Cancel", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 


      dialog.cancel(); 

     } 
    }); 
    dialog.show(); 
4

Si può provare questo:

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

spero che possa aiutare ...

Problemi correlati