Chciałbym zmienić układ w zależności od tego, czy wirtualna klawiatura jest wyświetlana, czy nie. Przeszukałem API i różne blogi, ale nie mogę znaleźć niczego przydatnego.
Czy to możliwe?
Dzięki!
android
events
android-softkeyboard
Szlifierka Versluys
źródło
źródło
Odpowiedzi:
Uwaga
Musisz sam poradzić sobie ze zmianami konfiguracji.
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
Próba:
Następnie wystarczy zmienić widoczność niektórych widoków, zaktualizować pole i zmienić plik układu.
źródło
newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO
~ ChrisTo może nie być najskuteczniejsze rozwiązanie. Ale działało to dla mnie za każdym razem ... Wywołuję tę funkcję tam, gdzie muszę słuchać SoftKeyboard.
Uwaga: Takie podejście spowoduje problemy, jeśli użytkownik użyje pływającej klawiatury.
źródło
android:windowSoftInputMode="adjustPan"
lubadjustResize
z nim, ponieważ układ nigdy nie zmienia rozmiaru.Jeśli chcesz obsługiwać wyświetlanie / ukrywanie okna klawiatury IMM (wirtualnej) z działania, musisz podklasować swój układ i zastąpić metodę onMesure (abyś mógł określić zmierzoną szerokość i zmierzoną wysokość swojego układu). Następnie ustaw układ podklas jako główny widok działania za pomocą setContentView (). Teraz będziesz mógł obsługiwać pokazy / ukrywanie okien IMM. Jeśli to brzmi skomplikowanie, to nie jest tak naprawdę. Oto kod:
main.xml
Teraz w swojej działalności zadeklaruj podklasę dla swojego układu (main.xml)
Z kodu wynika, że nadmuchujemy układ dla naszej aktywności w konstruktorze podklasy
A teraz po prostu ustaw widok zawartości układu podklas dla naszej działalności.
źródło
android:windowSoftInputMode="adjustPan"
lubadjustResize
z nim, ponieważ układ nigdy nie zmienia rozmiaru.Zrobiłem w ten sposób:
Dodaj
OnKeyboardVisibilityListener
interfejs.HomeActivity.java :
Mam nadzieję, że to ci pomoże.
źródło
W oparciu o kod z Nebojsa Tomcic opracowałem następującą podklasę RelativeLayout:
Działa to całkiem dobrze ... Zaznacz, że to rozwiązanie będzie działać, gdy Tryb Miękkiego Wprowadzania Twojej Aktywności jest ustawiony na „WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE”
źródło
android:windowSoftInputMode="adjustPan"
lubadjustResize
z nim, ponieważ układ nigdy nie zmienia rozmiaru.Podobnie jak odpowiedź @ amalBit, zarejestruj nasłuchiwanie w układzie globalnym i oblicz różnicę widocznego dna dectorView i proponowanego dna, jeśli różnica jest większa niż pewna wartość (domyślna wysokość IME), uważamy, że IME jest wyższy:
próg wysokości 100 to odgadnięta minimalna wysokość edytora IME.
Działa to zarówno dla adjustPan, jak i adjustResize.
źródło
Rozwiązanie Nebojsa prawie dla mnie zadziałało. Kiedy kliknąłem wewnątrz wielowierszowego tekstu EditText, wiedziałem, że klawiatura jest wyświetlana, ale kiedy zacząłem pisać wewnątrz EditText, faktyczna wysokość i proponowana wysokość były nadal takie same, więc nie wiedziałam, że klawiatura jest nadal wyświetlana. Wprowadziłem niewielką modyfikację, aby zapisać maksymalną wysokość i działa dobrze. Oto poprawiona podklasa:
źródło
Nie jestem pewien, czy ktoś to opublikuje. Znaleziono rozwiązanie to proste w użyciu! . SoftKeyboard klasa jest na gist.github.com . Ale podczas gdy wywołanie zwrotne / ukrywanie klawiatury na klawiaturze wymaga obsługi, aby poprawnie wykonywać czynności w interfejsie użytkownika:
źródło
Rozwiązuję ten problem, nadpisując onKeyPreIme (int keyCode, KeyEvent event) w moim niestandardowym EditText.
źródło
Mam do tego jakiś hack. Chociaż nie wydaje się być sposób, aby wykryć, kiedy klawiatura wykazało lub ukryty, to może faktycznie wykryć, kiedy jest o być pokazane lub ukryte poprzez ustawienie
OnFocusChangeListener
naEditText
tym, że słuchasz.UWAGA: Jedną z rzeczy, o których należy pamiętać podczas tego włamania, jest to, że oddzwanianie jest uruchamiane natychmiast po
EditText
uzyskaniu lub utracie ostrości. To faktycznie uruchomi się tuż przed wyświetleniem lub ukrywaniem się miękkiej klawiatury. Najlepszym sposobem, w jaki znalazłem coś po pokazaniu lub ukryciu klawiatury, jest użycie aHandler
i opóźnienie czegoś ~ 400 ms, na przykład:źródło
OnFocusChangeListener
mówi tylko, czyEditText
ma fokus po zmianie stanu. AleIME
może być ukryty, gdyEditText
jest skupiony, jak wykryć tę sprawę?Sander, myślę, że próbujesz pokazać widok zablokowany przez miękką klawiaturę. Spróbuj tego http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html .
źródło
Rozwiązałem problem z kodowaniem wstecznym jednowierszowego tekstu.
źródło
Możesz także sprawdzić, czy pierwsze wyściółki dla dzieci DecorView są dolne. Zostanie ustawiona na wartość niezerową, gdy zostanie wyświetlona klawiatura.
źródło
Ukryj | Pokaż zdarzenia na klawiaturze można odsłuchiwać poprzez prosty hack w OnGlobalLayoutListener:
Tutaj ActivityRootView to widok główny Twojej aktywności.
źródło
za pomocą viewTreeObserver, aby łatwo uzyskać zdarzenie z klawiatury.
** layout_parent to twój widok
edit_text.parent
źródło
Odpowiedź Nebojsa Tomcic nie była dla mnie pomocna. Mam
RelativeLayout
z nimTextView
iAutoCompleteTextView
wewnątrz. Muszę przewinąć wTextView
dół, gdy klawiatura jest wyświetlana i gdy jest ukryta. Aby to osiągnąć, przesłoniłemonLayout
metodę i działa ona dla mnie dobrze.źródło