Używam DialogFragment
i chociaż pomyślnie ustawiłem obraz, aby zamknąć (tj. Zamknąć) okno dialogowe po naciśnięciu, trudno mi znaleźć sposób na zamknięcie okna dialogowego, gdy użytkownik kliknie gdziekolwiek poza nim, tak jak działa z normalne okna dialogowe. Myślałem, że będzie coś takiego
dialogFragment.setCanceledOnTouchOutside(true);
zadzwonić, ale nie widzę tego w dokumentacji.
Czy to DialogFragment
w ogóle możliwe ? A może szukam w złych miejscach? Próbowałem przechwytywać zdarzenia dotykowe w aktywności „rodzica”, ale poza tym, że nie otrzymywałem żadnego zdarzenia dotykowego, nie wydawało mi się to właściwe.
onCreateView
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... getDialog().setCanceledOnTouchOutside(true); ... }
źródło
/** The system calls this only when creating the layout in a dialog. */ @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // The only reason you might override this method when using onCreateView() is // to modify any dialog characteristics. For example, the dialog includes a // title by default, but your custom layout might not need it. So here you can // remove the dialog title, but you must call the superclass to get the Dialog. Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setCanceledOnTouchOutside(true); return dialog; }
źródło
setCanceledOnTouchOutside
wonCreateView
zgodnie @Apurv. Powinienem wspomnieć, żesetCanceledOnTouchOutside(false)
Wiele odpowiedzi tutaj, ale aplikacja ulega awarii po otwarciu okna dialogowego. Pisanie w
getDialog().setCanceledOnTouchOutside(true);
środkuonCreateView
nie działało i spowodowało awarię mojej aplikacji.(Używam
AppCompatActivity
jako mojej BaseActivity iandroid.app.DialogFragment
jako mojego fragmentu).To, co działa, to jeden z dwóch następujących wierszy:
LUB
wewnątrz
onActivityCreated
jak@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimationZoom; //getDialog().getWindow().setDimAmount(0.85f); getDialog().setCanceledOnTouchOutside(true);//See here is the code }
Czego nie używać:
zgłasza następujący błąd
A napisanie kodu w
onCreateView
aplikacji wywala! Zaktualizuj odpowiedź, jeśli znajdziesz coś nie tak.źródło
onCreateDialog()
, w którym jest to zwykły sposób inicjalizacji. W tym przypadkuonCreateView()
nic nie robi, a nawet nie zawiera widoku. Możesz spróbować przenieść kod doonCreateDialog()
.onCreateDialog
,onCreateView
w niedalekiej przeszłości. Może się mylę i powinieneś zachowaćonActivityCreated
, jest to fajna metoda na wykonanie dodatkowej inicjalizacji (patrz na przykład stackoverflow.com/a/50734566/2914140 ).BottomSheet
implementacją. Może być inaczej w przypadku BSheet Zgadzam się. Ale to rozwiązanieDialogFragment
działa dobrze.DialogFragment.getDialog().setCanceledOnTouchOutside(false);
To było błędne. Miałem ten sam problem. Działa to dobrze dla Java i Mono dla Androida Mono będzie:
this.getDialog().SetCanceledOnTouchOutside(false);
źródło
Dialog.SetCanceledOnTouchOutside(true);
Pracował dla mnie
mój kod
class dlgRegister : DialogFragment { public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { .... .... } public override void OnActivityCreated(Bundle savedInstanceState) { Dialog.Window.RequestFeature(WindowFeatures.NoTitle); Dialog.SetCanceledOnTouchOutside(true); base.OnActivityCreated(savedInstanceState); Dialog.Window.Attributes.WindowAnimations = Resource.Style.dialog_animation; } }
źródło
Jeśli chcesz wykonać jakąś logikę po kliknięciu poza a
DialogFragment
, po prostu zastąp metodę onCancel.override fun onCancel(dialog: DialogInterface) { super.onCancel(dialog) // Do your work here }
źródło
Poleciłbym skorzystać z mojego rozwiązania dopiero po wypróbowaniu powyższych rozwiązań. Tutaj opisałem swoje rozwiązanie . Krótko mówiąc, sprawdzam granice dotykowe DialogFragment.getView (). Kiedy punkty dotykowe znajdują się poza DialogFragment, odrzucam okno dialogowe.
źródło