Jak mogę wykryć zdarzenie klawisza delete (backspace) dla editText? Próbowałem użyć TextWatchera, ale kiedy editText jest pusty, kiedy naciskam klawisz Delete, nic się nie dzieje. Chcę wykryć klawisz usuwania, w którym naciśnij przycisk editText, nawet jeśli nie ma tekstu.
android
events
android-edittext
key
Buda Gavril
źródło
źródło
event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DEL
jeśli nie chcesz, aby zdarzenie strzelało dwa razy za jednym naciśnięciem klawisza BackspaceMinęło trochę czasu, odkąd pytałeś, ale ja miałem ten sam problem. Jak już wspomniał Estel, problem z kluczowymi słuchaczami polega na tym, że działają one tylko z klawiaturami sprzętowymi. Aby to zrobić za pomocą IME (klawiatura miękka) , rozwiązanie jest nieco bardziej skomplikowane.
Jednolity sposób właściwie chcemy nadpisać jest
sendKeyEvent
w wEditText
„sInputConnection
klasy. Ta metoda jest wywoływana, gdy w edytorze IME wystąpią kluczowe zdarzenia. Ale aby to przesłonić, musimy zaimplementować niestandardową,EditText
która przesłaniaonCreateInputConnection
metodę, opakowując domyślnyInputConnection
obiekt w klasę proxy! : |Brzmi skomplikowanie, ale oto najprostszy przykład, jaki mogłem wymyślić:
Linia z wywołaniem
setRandomBackgroundColor
jest miejscem, w którym następuje moja specjalna akcja cofania. W takim przypadku zmianaEditText
koloru tła.Jeśli zawyżasz to z XML, pamiętaj, aby użyć pełnej nazwy pakietu jako tagu:
źródło
To tylko dodatek do odpowiedzi Idris, dodający również zastąpienie do deleteSurroundingText. Więcej informacji na ten temat znalazłem tutaj: Android: Backspace in WebView / BaseInputConnection
źródło
deleteSurroundingText
Nieco było dokładnie to, co potrzebne po wypróbowaniu niezliczone inne rozwiązania.Oto moje proste rozwiązanie, które działa dla wszystkich API:
AKTUALIZACJA 17.04.18 .
Jak wskazano w komentarzach, to rozwiązanie nie śledzi naciśnięcia klawisza Backspace, jeśli EditText jest pusty (tak samo jak większość innych rozwiązań).
Jednak w większości przypadków jest to wystarczające.
PS Gdybym miał dziś stworzyć coś podobnego, zrobiłbym:
Następnie użyj go jako zwykłego TextWatchera:
źródło
Wysłałem 2 dni na znalezienie rozwiązania i znalazłem działające :) (na klawiszach programowych)
Po dodaniu Texttwatchera do EditText:
Mam nadzieję, że działa również na innych urządzeniach z Androidem (Samsung, LG itp.).
źródło
Moje proste rozwiązanie, które działa doskonale. Powinieneś dodać flagę. Mój fragment kodu:
źródło
Przykład tworzenia EditText za pomocą TextWatchera
niestandardowy TextWatcher
źródło
dla kogoś, kto używa Kotlin
addOnTextChanged
nie jest wystarczająco elastyczny, aby obsłużyć niektóre przypadki (np. wykryć, czy użytkownik naciśnie klawisz Usuń, gdy tekst edycji był pusty)setOnkeyListener
działał nawet miękka klawiatura lub hardkeyboard! ale tylko na niektórych urządzeniach . W moim przypadku działa na Samsungu s8 ale nie działa na Xiaomi mi8 se.jeśli używasz kotlin, możesz użyć funkcji crossline, działa
doOnTextChanged
tak samo, jakaddOnTextChanged
wywołanie zwrotne, nawet tekst edycji był pusty.UWAGA: doOnTextChanged jest częścią biblioteki Android KTX
źródło
doOnTextChanged
funkcja rozszerzenia jest dostępna w bibliotece Android KTXEditText
? Z góry dziękujęIstnieje podobne pytanie w Stackoverflow. Musisz nadpisać
EditText
, aby uzyskać dostęp doInputConnection
obiektu, który zawieradeleteSurroundingText
metodę. Pomoże Ci to wykryć zdarzenie usunięcia (backspace). Proszę spojrzeć na rozwiązanie, które tam dostarczyłem Android - nie można przechwytywać naciśnięcia klawisza Backspace / Delete w soft. klawiaturaźródło
Wydaje się, że to działa dla mnie:
źródło
Mam również do czynienia z tym samym problemem w oknie dialogowym .. ponieważ używam setOnKeyListener .. Ale ustawiam domyślny powrót true. Po zmianie jak w poniższym kodzie to działa dla mnie dobrze ..
źródło
Na podstawie @Jiff
ZanyEditText
tutaj jestWiseEditText
zsetSoftKeyListener(OnKeyListener)
źródło
Mój problem polegał na tym, że miałem niestandardowy
Textwatcher
, więc nie chciałem dodawaćOnKeyListener
do niego,EditText
jak również nie chciałem tworzyć niestandardowegoEditText
. Chciałem wykryć, czy w mojejafterTextChanged
metodzie naciśnięto klawisz Backspace , więc nie powinienem wywoływać zdarzenia.Oto jak to rozwiązałem. Mam nadzieję, że to byłoby pomocne dla kogoś.
źródło
Przetestowałem rozwiązanie @ Jeffa w wersji 4.2, 4.4, 6.0. Na 4.2 i 6.0 działa dobrze. Ale na 4.4 to nie działa.
Znalazłem łatwy sposób na obejście tego problemu. Kluczową kwestią jest wstawienie niewidocznego znaku do zawartości EditText na początku i nie pozwól użytkownikowi przesuwać kursora przed tym znakiem. Mój sposób polega na wstawieniu znaku odstępu z elementem ImageSpan o zerowej szerokości. Oto mój kod.
Potrzebujemy niestandardowego EditText, który ma SelectionChangeListener
}
I ostatni krok
A teraz skończyliśmy ~ Możemy wykryć zdarzenie klawisza backspace, gdy EditText nie ma rzeczywistej treści, a użytkownik nie będzie wiedział nic o naszej sztuczce.
źródło
To pytanie może być stare, ale odpowiedź jest naprawdę prosta przy użyciu TextWatchera.
źródło
Znalazłem naprawdę proste rozwiązanie, które działa z miękką klawiaturą.
źródło
Możesz ustawić nasłuchiwanie kluczy dla aktywności, a w metodzie wywołania zwrotnego możesz wykryć, który klawisz uderzył użytkownika. Poniższy kod służy do celów informacyjnych. Mam nadzieję, że to pomoże.
źródło