2013-08-16 9 views
39

QuandosetOnCancelListener e setOnDismissListener non viene chiamato per AlertDialog per pulsante Indietro premuto o toccare al di fuori

  • tocco di fuori della regione finestra
  • Premere sul tasto back

mi aspetto onDismiss (O onCancel) verrà chiamato. Tuttavia, non vengono entrambi chiamati. Posso sapere che mi manca qualcosa? Da AlertDialog setOnDismissListener not working, ho pensato che onCancel verrà chiamato quando premo il pulsante Indietro. Ma non funziona per me. Posso sapere che c'è qualcosa che mi è sfuggito?

public class RateAppDialogFragment extends SherlockDialogFragment { 
    public static RateAppDialogFragment newInstance() { 
     RateAppDialogFragment rateAppDialogFragment = new RateAppDialogFragment(); 
     return rateAppDialogFragment; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Get the layout inflater 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View view = inflater.inflate(R.layout.rate_app_dialog_fragment, null); 

     Utils.setCustomTypeFace(view, Utils.ROBOTO_LIGHT_TYPE_FACE); 

     final AlertDialog dialog = new AlertDialog.Builder(this.getSherlockActivity())    
     .setTitle("Love JStock?") 
     .setView(view) 
     // Add action buttons 
     .setPositiveButton("Rate 5 stars \u2605", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       Utils.showShortToast("Rate"); 
      } 
     }) 
     .setNegativeButton("No", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       Utils.showShortToast("No"); 
      } 
     }) 
     .setNeutralButton("Later", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       Utils.showShortToast("Later"); 
      } 
     }) 
     .create(); 

     dialog.setCanceledOnTouchOutside(true); 

     dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 

      @Override 
      public void onCancel(DialogInterface dialog) { 
       Utils.showShortToast("Back button pressed?"); 
      } 
     }); 

     dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 

      @Override 
      public void onDismiss(DialogInterface dialog) { 
       // TODO Auto-generated method stub 
       Utils.showShortToast("Back button pressed?"); 
      } 
     }); 

     return dialog; 
    } 

} 

FragmentManager fm = fragmentActivity.getSupportFragmentManager(); 
    if (fm.findFragmentByTag(RATE_APP_DIALOG_FRAGMENT) != null) { 
     return; 
    } 

    RateAppDialogFragment rateAppDialogFragment = RateAppDialogFragment.newInstance(); 
    rateAppDialogFragment.show(fm, RATE_APP_DIALOG_FRAGMENT); 
+0

@pskink si fa a testare corri sul codice? Funziona davvero bene per te? –

+0

Uso Log.d. Nessuna differenza. Né il brindisi né il messaggio di registrazione non vengono visualizzati. –

+0

lo eseguo con una configurazione minima - Generatore con solo pulsanti positivi e negativi, testato con 2.2 avd – pskink

risposta

106

Il problema si verifica quando si utilizza DialogFragment per visualizzare Dialog

Secondo http://developer.android.com/reference/android/app/DialogFragment.html, la soluzione è quella di ignorare onCancel in DialogFragment

Si prega di prendere nota http://developer.android.com/reference/android/app/DialogFragment.html#onCreateDialog(android.os.Bundle) troppo

Nota: DialogFragment proprio il Dialog.setOnCancelListener e callback Dialog.setOnDismissListener . Non devi metterli da solo. Per informazioni su questi eventi, ignorare onCancel (DialogInterface) e onDismiss (DialogInterface).

// This is DialogFragment, not Dialog 
@Override 
public void onCancel(DialogInterface dialog) { 
} 
+1

bella soluzione! In realtà è il modo di lavorare con Annulla in DialogFragment. – sud007

4

Non avete impostato backPressed chiave evento

dialog.setOnKeyListener(new Dialog.OnKeyListener() { 
    @Override 
    public boolean onKey(DialogInterface arg0, int keyCode, KeyEvent event) { 
     // TODO Auto-generated method stub 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      finish(); 
     } 
     return true; 
    } 
}); 
+1

Ma che ne dici di sfiorare l'area della finestra di dialogo? Inoltre, hai idea del perché setOnCancelListener e setOnDismissListener non funzionino? Dovrebbero funzionare, no? –

+0

Come hai ottenuto la soluzione.dirò che è stato un grosso errore e stupido ..: D è obbligatorio che, se si sta eseguendo l'override del metodo predefinito, è necessario "sovrascrivere" su di esso. – SilentKiller

0

nel vostro DialogFragment, ignorare

@Override 
public void onStop() { 
    super.onStop(); 
    if (mListener != null) { 
     // do something here 
    } 
} 
4

Se si utilizza AlertDialog, vedere

builder.setOnCancelListener(new DialogInterface.OnCancelListener() { 
    @Override 
    public void onCancel(DialogInterface dialog) { 
     // dialog dismiss without button press 
    } 
}); 

e dialog.setCanceledOnTouchOutside(true) (grazie @LeosLiterak)

+0

e aggiungi dialog.setCanceledOnTouchOutside (true) pure –

+0

@LeosLiterak grazie, aggiunto. –

+0

java.lang.IllegalStateException: Non è possibile impostare DialC's OnCancelListener o OnDismissListener – Joe

Problemi correlati