2013-08-16 9 views
39

KiedysetOnCancelListener i setOnDismissListener nie jest wymagana AlertDialog za powrotem wciśnięty przycisk lub dotknij poza

  • dotykowy poza regionem dialogowym
  • Naciśnij przycisk na tylnym

Czekam onDismiss (Lub onCancel) zostanie wywołana. Jednak obaj nie są powołani. Czy mogę wiedzieć, że jest coś, czego mi brakuje? Od AlertDialog setOnDismissListener not working, myślałem, że onCancel zostanie wywołany po naciśnięciu przycisku Wstecz. Ale to nie działa dla mnie. Czy mogę wiedzieć, czy coś tam przeoczyłem?

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 Czy testowych uruchomić na kodzie? To naprawdę działa dobrze dla ciebie? –

+0

Używam Log.d. Nie inny. Ani toast, ani komunikat logowania nie są wyświetlane. –

+0

uruchamiam go z minimalną konfiguracją - Builder z tylko dodatnimi i ujemnymi przyciskami, testowany z 2.2 avd – pskink

Odpowiedz

106

Problem dzieje, gdy używasz DialogFragment wyświetlanie Dialog

Według http://developer.android.com/reference/android/app/DialogFragment.html, rozwiązaniem jest, aby zastąpić onCancel w DialogFragment

Proszę zwrócić uwagę, z http://developer.android.com/reference/android/app/DialogFragment.html#onCreateDialog(android.os.Bundle) zbyt

Uwaga: DialogFragment właścicielem Dialog.setOnCancelListener i Dialog.setOnDismissListener callbacków . Nie możesz sam ich ustawiać. Aby dowiedzieć się o tych zdarzeniach, przesuń je na Anuluj (DialogInterface) i na Wyłączenie (DialogInterface).

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

fajne rozwiązanie! W rzeczywistości jest to sposób pracy z funkcją Anuluj w DialogFragment. – sud007

4

Nie ustawiono backPressed kluczowym wydarzeniem

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

Ale co powiesz na dotknięcie poza obszarem okna dialogowego? Ponadto masz pomysł, dlaczego setOnCancelListener i setOnDismissListener nie działa? Powinny działać, prawda? –

+0

Skoro masz rozwiązanie.Powiem, że to był duży i głupi błąd: D to obowiązkowe, że jeśli nadpisujesz domyślną metodę, musisz mieć na prawo '@ override'. – SilentKiller

0

w DialogFragment, zastępują

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

Jeśli używasz AlertDialog patrz

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

i dialog.setCanceledOnTouchOutside(true) (dzięki @LeosLiterak)

+0

i dodaj dialog.setCanceledOnTouchOutside (true) oraz –

+0

@LeosLiterak dzięki, dodane. –

+0

java.lang.IllegalStateException: Nie można ustawić okna dialogowego OnCancelListener lub OnDismissListener – Joe

Powiązane problemy