Mam okno dialogowe EditText
do wprowadzania danych. Kiedy kliknę przycisk „tak” w oknie dialogowym, potwierdzi wejście, a następnie zamknie okno dialogowe. Jeśli jednak dane wejściowe są nieprawidłowe, chcę pozostać w tym samym oknie dialogowym. Za każdym razem, bez względu na dane wejściowe, okno dialogowe powinno zostać automatycznie zamknięte po kliknięciu przycisku „nie”. Jak mogę to wyłączyć? Nawiasem mówiąc, użyłem PositiveButton i NegativeButton jako przycisku w oknie dialogowym.
android
dialog
android-alertdialog
android-dialog
android-dialogfragment
użytkownik304881
źródło
źródło
Oto niektóre rozwiązania dla wszystkich typów okien dialogowych, w tym rozwiązanie dla AlertDialog.Builder, które będzie działać na wszystkich poziomach API (działa poniżej API 8, czego druga odpowiedź tutaj nie robi). Istnieją rozwiązania dla AlertDialogs za pomocą AlertDialog.Builder, DialogFragment i DialogPreference.
Poniżej znajdują się przykłady kodu pokazujące, jak zastąpić domyślną procedurę obsługi przycisków wspólnych i zapobiec zamknięciu okna dialogowego dla tych różnych form okien dialogowych. Wszystkie przykłady pokazują, jak zapobiec zamykaniu okna dialogowego przez przycisk dodatni.
Uwaga: opis działania zamknięcia okna dialogowego pod maską dla podstawowych klas Androida i dlaczego wybrano następujące podejścia po przykładach dla tych, którzy chcą więcej szczegółów
AlertDialog.Builder - Zmień domyślną procedurę obsługi przycisków natychmiast po show ()
DialogFragment - przesłonięcie onResume ()
DialogPreference - przesłonięcie showDialog ()
Wyjaśnienie podejść:
źródło
ProgressDialog
po kliknięciu na niego przycisku?Alternatywne rozwiązanie
Chciałbym przedstawić alternatywną odpowiedź z perspektywy UX.
Dlaczego chcesz uniemożliwić zamknięcie okna dialogowego po kliknięciu przycisku? Przypuszczalnie dzieje się tak, ponieważ masz niestandardowe okno dialogowe, w którym użytkownik nie dokonał wyboru lub jeszcze nie wypełnił wszystkiego. A jeśli nie są ukończone, nie należy w ogóle pozwalać im klikać przycisku dodatniego. Wyłącz ją, aż wszystko będzie gotowe.
Inne odpowiedzi tutaj zawierają wiele sztuczek, które zastępują pozytywne kliknięcie przycisku. Gdyby to było ważne, czy Android nie stworzyłby dogodnej metody? Nie zrobili tego.
Zamiast tego przewodnik projektowania okien dialogowych pokazuje przykład takiej sytuacji. Przycisk OK jest wyłączony, dopóki użytkownik nie dokona wyboru. W ogóle nie są konieczne żadne nadrzędne sztuczki. Dla użytkownika jest oczywiste, że przed kontynuowaniem należy jeszcze coś zrobić.
Jak wyłączyć przycisk dodatni
Zobacz dokumentację Androida, aby utworzyć niestandardowy układ okna dialogowego . Zaleca się umieszczenie
AlertDialog
wewnątrzDialogFragment
. Następnie wszystko, co musisz zrobić, to ustawić detektory na elementach układu, aby wiedziały, kiedy włączyć lub wyłączyć przycisk dodatni.EditText
, użyj TextWatcher .Przycisk dodatni można wyłączyć w następujący sposób:
Oto cała praca
DialogFragment
z wyłączonym przyciskiem dodatnim, takim jak na powyższym obrazku.Niestandardowe okno dialogowe można uruchomić z działania takiego jak to:
Notatki
Przycisk jest nadal
null
wonCreateDialog
tak ja go wyłączyłonResume
. Ma to niepożądany efekt ponownego wyłączenia go, jeśli użytkownik przełączy się na inną aplikację, a następnie wróci bez zamykania okna dialogowego. Można to rozwiązać również przez odznaczenie dowolnych wyborów użytkownika lub przez wywołanieRunnable
z wonCreateDialog
celu wyłączenia przycisku w następnej pętli uruchamiania.Związane z
źródło
Napisałem prostą klasę (AlertDialogBuilder), której można użyć do wyłączenia funkcji automatycznego odrzucania po naciśnięciu przycisków okna dialogowego.
Jest kompatybilny również z Androidem 1.6, więc nie korzysta z OnShowListener (który jest dostępny tylko API> = 8).
Zamiast korzystać z AlertDialog.Builder, możesz użyć tego CustomAlertDialogBuilder. Najważniejsze jest to, że nie powinieneś wywoływać metody create () , a jedynie metodę show () . Dodałem metody takie jak setCanceledOnTouchOutside () i setOnDismissListener , abyś mógł nadal ustawiać je bezpośrednio w .
Przetestowałem to na Androidzie 1.6, 2.x, 3.x i 4.x, więc powinno działać całkiem dobrze. Jeśli znajdziesz jakieś problemy, prosimy o komentarz tutaj.
EDYCJA Oto mały przykład użycia CustomAlertDialogBuilder:
Twoje zdrowie,
Yuvi
źródło
Context mContext
i ustaw je w konstruktorze.Oto coś, jeśli używasz
DialogFragment
- co jest i tak zalecanym sposobem obsługi okien dialogowych.Co się dzieje z AlertDialog w
setButton()
sposobie (i wyobrażam sobie to samo zAlertDialogBuilder
„ssetPositiveButton()
asetNegativeButton()
) jest to, że przycisk można ustawić (na przykładAlertDialog.BUTTON_POSITIVE
) z nim rzeczywiście wywołać dwa różneOnClickListener
obiekty po naciśnięciu.Pierwsza istota DialogInterface.OnClickListener , który jest parametrem
setButton()
,setPositiveButton()
orazsetNegativeButton()
.Drugi to View.OnClickListener , który zostanie ustawiony tak, aby automatycznie odrzucał twoje
AlertDialog
naciśnięcie dowolnego przycisku - i jest ustawianyAlertDialog
sam.Co można zrobić, to skorzystać
setButton()
znull
jakDialogInterface.OnClickListener
, aby utworzyć przycisk, a następnie połączyć się niestandardową metodę działania wewnątrzView.OnClickListener
. Na przykład,Następnie można przesłonić domyślne
AlertDialog
„s przyciski”View.OnClickListener
(które inaczej byłoby zamknąć okno) wDialogFragment
„sonResume()
metody:Będziesz musiał ustawić to w
onResume()
metodzie, ponieważgetButton()
powrócinull
do momentu wyświetlenia okna dialogowego!Powinno to spowodować wywołanie niestandardowej metody akcji tylko raz, a okno dialogowe nie zostanie domyślnie odrzucone.
źródło
Zainspirowany odpowiedzią Toma, myślę, że pomysł jest następujący:
onClickListener
podczas tworzenia okna dialogowego wartośćnull
onClickListener
po wyświetleniu okna dialogowego.Możesz zastąpić
onShowListener
podobnego Toma. Alternatywnie możeszshow()
onClickListener
w następujący sposób (myślę, że nieco bardziej czytelny).Kod:
źródło
W przypadku wersji wcześniejszych niż API 8 rozwiązałem problem za pomocą flagi boolean, nasłuchiwania z odrzucenia i wywołania okna dialogowego. Pokaż ponownie, jeśli zawartość edytowanego tekstu nie jest poprawna. Lubię to:
źródło
Odpowiedź pod tym linkiem jest prostym rozwiązaniem, które jest kompatybilne bezpośrednio z API 3. Jest bardzo podobne do rozwiązania Toma Bollwitta, ale bez korzystania z mniej kompatybilnego OnShowListener.
Wprowadziłem drobne zmiany w kodzie Kamena od czasu rozszerzenia EditTextPreference.
Taka zabawa!
źródło
Ten kod będzie działał dla ciebie, ponieważ miałem podobny problem i to zadziałało dla mnie. :)
1- Zastąp metodę Onstart () w klasie fragmentu okna dialogowego.
źródło
Dla ProgressDialogs
Aby zapobiec automatycznemu zamykaniu okna dialogowego, musisz ustawić następujące
OnClickListener
po nimProgressDialog
, tak:źródło
źródło
możesz dodać builder.show (); po potwierdzeniu wiadomość przed powrotem;
lubię to
źródło
Aby zapobiec zamykaniu okna dialogowego po kliknięciu i powinno ono zamykać się tylko wtedy, gdy Internet jest dostępny
Próbuję zrobić to samo, ponieważ nie chcę, aby okno dialogowe było zamknięte, dopóki Internet nie zostanie podłączony.
Oto mój kod:
A oto mój kod menedżera łączności:
źródło
The specified child already has a parent. You must call removeView() on the child's parent first
Jeśli używasz
material design
, proponuję sprawdzić okna dialogowe materiałów . Naprawiono dla mnie kilka problemów związanych z aktualnie otwartymi błędami Androida (patrz 78088 ), ale co najważniejsze dla tego biletu maautoDismiss
flagę, którą można ustawić podczas korzystania zBuilder
.źródło
Użyj niestandardowy układ dla twojego
DialogFragment
i dodajLinearLayout
mocy swojej treści, które mogą być stylizowany jako obramowania, aby dopasować Google projektowania materiałów. Następnie znajdź nowo utworzone przyciski i zastąp jeOnClickListener
.Przykład:
dialog_add_topic.xml :
To jest wynik końcowy.
źródło
Można go zbudować w najprostszy sposób:
Okno dialogowe alarmu z widokiem niestandardowym i dwoma przyciskami (dodatni i ujemny).
CustomClickLister of Positive Button of Alert Dailog :
Gotowy
źródło
Prawdopodobnie jest to bardzo późna odpowiedź, ale załatwienie problemu zrobi setCancelable.
źródło