Mój układ zawiera ListView
, SurfaceView
i EditText
. Kiedy klikam EditText
, otrzymuje fokus i pojawia się klawiatura ekranowa. Kiedy klikam gdzieś poza obszarem EditText
, nadal ma fokus (nie powinien). Myślę, że mógłbym ustawić je OnTouchListener
na innych widokach w układzie i ręcznie wyczyścić EditText
fokus. Ale wydaje się zbyt hakerski ...
Ja też mam taką samą sytuację w innym layoucie - widok listy z różnymi typami elementów, z których część ma EditText
wewnątrz. Działają tak, jak napisałem powyżej.
Zadaniem jest EditText
utrata koncentracji, gdy użytkownik dotknie czegoś poza nim.
Widziałem tutaj podobne pytania, ale nie znalazłem żadnego rozwiązania ...
źródło
hideSoftInputFromWindow()
wtedy jasne ostrościOpierając się na odpowiedzi Kena, oto najbardziej modułowe rozwiązanie kopiuj i wklej.
Nie potrzeba XML.
Umieść go w swojej aktywności, a będzie on dotyczył wszystkich tekstów edycji, w tym fragmentów tej aktywności.
źródło
MotionEvent.ACTION_DOWN
sięMotionEvent.ACTION_UP
na kodzie. Świetna odpowiedź przy okazji!Dla widoku nadrzędnego EditText, niech następujące 3 atrybuty będą „ true ”:
klikalne , z możliwością fokusowania , focusableInTouchMode .
Jeśli widok chce się skupić, musi spełniać te 3 warunki.
Zobacz android.view :
Mam nadzieję, że to pomoże.
źródło
(clickable) *OR* (focusable *AND* focusableInTouchMode)
;)Po prostu umieść te właściwości w najwyższej pozycji nadrzędnej.
źródło
Odpowiedź Kena działa, ale jest zepsuta. Jak wspomina pcans w komentarzu do odpowiedzi, to samo można zrobić za pomocą metody dispatchTouchEvent. To rozwiązanie jest bardziej przejrzyste, ponieważ pozwala uniknąć hakowania kodu XML za pomocą przezroczystego, fikcyjnego układu FrameLayout. Oto jak to wygląda:
źródło
Dla mnie poniżej rzeczy zadziałały -
1. Dodawanie
android:clickable="true"
iandroid:focusableInTouchMode="true"
doparentLayout
zEditText
czyliandroid.support.design.widget.TextInputLayout
2. Nadpisywanie
dispatchTouchEvent
w klasie Activity i wstawianiehideKeyboard()
funkcji3. Dodawanie
setOnFocusChangeListener
do EditTextźródło
Prawdopodobnie już znalazłeś odpowiedź na ten problem, ale szukałem sposobu rozwiązania tego problemu i nadal nie mogę znaleźć dokładnie tego, czego szukałem, więc pomyślałem, że opublikuję to tutaj.
To, co zrobiłem, było następujące (jest to bardzo uogólnione, celem jest przedstawienie ci, jak postępować, kopiowanie i wklejanie całego kodu nie zadziała O: D):
Najpierw miej EditText i wszystkie inne widoki, które chcesz w swoim programie opakowane pojedynczym widokiem. W moim przypadku użyłem LinearLayout do zawijania wszystkiego.
Następnie w swoim kodzie musisz ustawić Odbiornik dotyku na swój główny LinearLayout.
Mam nadzieję, że to pomoże niektórym ludziom. A przynajmniej pomaga im zacząć rozwiązywać problem.
źródło
Po prostu zdefiniuj dwie właściwości rodzica tego
EditText
jako:Dlatego gdy użytkownik dotknie
EditText
obszaru poza obszarem, fokus zostanie usunięty, ponieważ fokus zostanie przeniesiony do widoku nadrzędnego.źródło
Mam
ListView
złożoneEditText
widoki. Scenariusz mówi, że po edycji tekstu w jednym lub kilku wierszach powinniśmy kliknąć przycisk „Zakończ”. UżyłemonFocusChanged
naEditText
widoku w środku,listView
ale po kliknięciu Zakończ dane nie są zapisywane. Problem został rozwiązany poprzez dodaniewewnątrz przycisku
onClickListener
„Zakończ” i dane zostały pomyślnie zapisane.źródło
Naprawdę uważam, że jest to solidniejszy sposób użycia
getLocationOnScreen
niżgetGlobalVisibleRect
. Ponieważ napotykam problem. Istnieje widok listy, który zawiera niektóre Edittext i jest ustawionyajustpan
w działaniu. Uważam, że zwracamgetGlobalVisibleRect
wartość, która wygląda jak zawierająca scrollY, ale event.getRawY jest zawsze na ekranie. Poniższy kod działa dobrze.źródło
Aby stracić fokus po dotknięciu innego widoku, oba widoki należy ustawić jako view.focusableInTouchMode (true).
Wygląda jednak na to, że nie zaleca się używania ostrości w trybie dotykowym. Zajrzyj tutaj: http://android-developers.blogspot.com/2008/12/touch-mode.html
źródło
Najlepszym sposobem jest użycie metody domyślnej
clearFocus()
Wiesz, jak rozwiązywać kody,
onTouchListener
prawda?Po prostu zadzwoń
EditText.clearFocus()
. Wyraźnie skupi się nalast EditText
.źródło
Jak zasugerował @pcans, możesz to nadpisać
dispatchTouchEvent(MotionEvent event)
w swojej aktywności.Tutaj otrzymujemy współrzędne dotyku i porównujemy je w celu wyświetlenia granic. Jeśli dotyk jest wykonywany poza widokiem, zrób coś.
Nie jest też konieczne sprawdzanie istnienia i widoczności widoku, jeśli układ Twojej aktywności nie zmienia się w trakcie działania (np. Nie dodajesz fragmentów ani nie zastępujesz / nie usuwasz widoków z układu). Ale jeśli chcesz zamknąć (lub zrobić coś podobnego) niestandardowe menu kontekstowe (jak w sklepie Google Play podczas korzystania z rozszerzonego menu elementu), konieczne jest sprawdzenie istnienia widoku. W przeciwnym razie otrzymasz plik
NullPointerException
.źródło
Ten prosty fragment kodu robi, co chcesz
źródło
W Kotlinie
hidekeyboard () jest rozszerzeniem Kotlin
W aktywności dodaj dispatchTouchEvent
Dodaj te właściwości w najwyższym miejscu nadrzędnym
źródło
To jest moja wersja oparta na kodzie zMana. Nie ukryje klawiatury, jeśli następny widok również jest tekstem edycji. Nie ukryje również klawiatury, jeśli użytkownik tylko przewinie ekran.
źródło