Chcę przechwycić zdarzenie, gdy użytkownik zakończy edycję EditText.
Jak można to zrobić?
android
android-edittext
eddyuk
źródło
źródło
override fun afterTextChanged(s: Editable?) { if (s.toString().length == 5) { val enteredString = s.toString() }
Odpowiedzi:
Gdy użytkownik zakończy edycję, naciśnie
Done
lubEnter
źródło
W lepszy sposób możesz również użyć odbiornika EditText onFocusChange, aby sprawdzić, czy użytkownik dokonał edycji: (Nie musisz polegać na naciśnięciu przez użytkownika przycisku Gotowe lub Enter na klawiaturze miękkiej)
Uwaga: W przypadku więcej niż jednego EditText możesz również pozwolić swojej klasie zaimplementować,
View.OnFocusChangeListener
a następnie ustawić detektory dla każdego z was EditText i zweryfikować je, jak poniżejźródło
EditText
. Nigdy nie straci ostrości.EditText
? Czy muszę używaćonEditorAction
?EditText
, potwierdzasz wszystko, co użytkownik robi, aby opuścić ekran.W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=605.52246, y[0]=969.4336, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=238238, downTime=235422, deviceId=0, source=0x1002 }
Mimo że coś wpisałem. To jest plik edittext, który akceptuje tylko liczby.Osobiście wolę automatyczne przesyłanie po zakończeniu pisania. Oto, jak możesz wykryć to zdarzenie.
Deklaracje i inicjalizacja:
Odbiornik w np. OnCreate ()
Tak więc, kiedy tekst jest zmieniany, licznik czasu zaczyna czekać na jakiekolwiek następne zmiany. Kiedy się pojawią, licznik czasu zostaje anulowany, a następnie uruchomiony ponownie.
źródło
Handler
zamiast nichMożesz to zrobić za pomocą setOnKeyListener lub używając textWatchera, takiego jak:
Ustaw obserwator tekstu
editText.addTextChangedListener(textWatcher);
Wtedy zadzwoń
źródło
Chociaż wiele odpowiedzi wskazuje we właściwym kierunku, myślę, że żadna z nich nie odpowiada na to, o czym myślał autor pytania. A przynajmniej inaczej zrozumiałem pytanie, ponieważ szukałem odpowiedzi na podobny problem. Problem polega na tym, że „Jak się dowiedzieć, kiedy użytkownik przestaje pisać bez naciskania przycisku” i uruchamia jakąś akcję (na przykład autouzupełnianie). Jeśli chcesz to zrobić, uruchom Timer w onTextChanged z opóźnieniem, które uważasz, że użytkownik przestał pisać (na przykład 500-700 ms), dla każdej nowej litery, gdy uruchamiasz licznik czasu, anuluj wcześniejszą (lub przynajmniej użyj jakiegoś rodzaju zaznacz, że kiedy zaznaczają, nic nie robią). Oto kod podobny do tego, którego użyłem:
Zauważ, że modyfikuję uruchomioną flagę logiczną w moim zadaniu asynchronicznym (zadanie pobiera plik json z serwera w celu automatycznego ukończenia).
Pamiętaj również, że tworzy to wiele zadań timera (myślę, że są one zaplanowane w tym samym wątku, ale musiałbyś to sprawdzić), więc prawdopodobnie jest wiele miejsc do poprawy, ale to podejście również działa i najważniejsze jest to, że powinieneś użyj timera, ponieważ nie ma zdarzenia „Użytkownik przestał pisać”
źródło
zarówno @Reno, jak i @Vinayak B odpowiadają razem, jeśli chcesz ukryć klawiaturę po wykonaniu czynności
źródło
Inne podejście ... oto przykład: jeśli użytkownik ma opóźnienie 600-1000 ms podczas pisania, możesz uznać, że został zatrzymany.
źródło
Okej, to na pewno zadziała w 100%.
Najpierw musisz skonfigurować odbiornik, jeśli klawiatura jest pokazywana lub ukrywana. Jeśli klawiatura jest wyświetlana, prawdopodobnie użytkownik pisze, w przeciwnym razie pisze.
źródło
heightDiff > 100
jest przerażające imho.W ten sposób rozwiązałem ten problem. Użyłem kotlin.
źródło
Miałem ten sam problem i nie chciałem polegać na tym, że użytkownik naciśnie Gotowe lub Enter.
Moją pierwszą próbą było użycie detektora onFocusChange, ale okazało się, że mój EditText ma domyślnie fokus. Gdy użytkownik nacisnął inny widok, onFocusChange został wyzwolony bez przypisania mu przez użytkownika fokusu.
Kolejne rozwiązanie zrobiło to za mnie, gdzie onFocusChange jest dołączony, jeśli użytkownik dotknął EditText:
W moim przypadku, gdy użytkownik skończył edycję, ekran został ponownie wyrenderowany, odnawiając w ten sposób obiekt myEditText. Jeśli ten sam obiekt jest zachowany, prawdopodobnie powinieneś usunąć detektor onFocusChange w onFocusChange, aby zapobiec problemowi onFocusChange opisanemu na początku tego postu.
źródło
Miałem ten sam problem, gdy próbowałem zaimplementować „teraz pisanie” w aplikacji czatu. spróbuj rozszerzyć EditText w następujący sposób:
}
źródło
Skończyłem ją z tym samym problemem i nie mogłem użyć rozwiązania z onEditorAction lub onFocusChange i nie chciałem wypróbować timera. Licznik czasu jest zbyt niebezpieczny, by smakować, ze względu na wszystkie wątki i zbyt nieprzewidywalny, ponieważ nie wiesz, kiedy kod jest wykonywany.
Operacja onEditorAction nie przechwytuje, gdy użytkownik wychodzi bez użycia przycisku, a jeśli go używasz, zauważ, że KeyEvent może mieć wartość null. Fokus jest zawodny z obu stron, użytkownik może go aktywować i wyjść bez wprowadzania tekstu lub wybierania pola, a użytkownik nie musi opuszczać ostatniego pola EditText.
Moje rozwiązanie wykorzystuje onFocusChange i flagę ustawioną, gdy użytkownik rozpoczyna edycję tekstu, oraz funkcję pobierającą tekst z ostatniego aktywnego widoku, który wywołuję w razie potrzeby.
Po prostu wyczyściłem fokus na wszystkich moich polach tekstowych, aby uchwycić kod widoku pozostawionego tekstu. Kod clearFocus jest wykonywany tylko wtedy, gdy pole ma fokus. Wywołuję funkcję w onSaveInstanceState, więc nie muszę zapisywać flagi (mEditing) jako stan widoku EditText i po kliknięciu ważnych przycisków i zamknięciu działania.
Bądź ostrożny z TexWatcherem, ponieważ jest on często wywoływany, używam warunku na fokusie, aby nie reagować, gdy kod onRestoreInstanceState wprowadza tekst. ja
źródło
Zrobiłem coś takiego jak ta abstrakcyjna klasa, której można użyć zamiast typu TextView.OnEditorActionListener.
źródło
Proste wywołanie zakończenia pisania w EditText
pracował dla mnie, jeśli używasz java przekonwertuj go
W Kotlinie
źródło