Mam Activity
gdzie jest 5 EditText
s. Gdy użytkownik kliknie pierwszą EditText
, klawiatura programowa otwiera się, aby wprowadzić do niej jakąś wartość. Chcę ustawić View
widoczność innych osób , Gone
kiedy miękka klawiatura otwiera się, a także kiedy użytkownik klika pierwszą, EditText
a także kiedy miękka klawiatura zamyka się z tego samego EditText
przycisku Wstecz. Następnie chcę ustawić View
widoczność innych osób jako widoczną.
Czy jest jakiś słuchacz, oddzwonienie lub jakikolwiek hack, gdy miękka klawiatura otwiera się po kliknięciu pierwszej EditText
w Androidzie?
trying to detect the virtual keyboard height in Android.
X
iY
położenie wskaźnika przypadają na klawiaturę / nad nią =>SecurityException
=> zmniejszY
i spróbuj ponownie => dopóki nie zostanie zgłoszony żaden wyjątek => aktualnaY
wartość to wysokość klawiatury. 2. jeśli klawiatura nie jest otwarta => nieSecurityException
.SecurityException
zostanie rzucony => klawiatura jest otwarta. W przeciwnym razie klawiatura jest zamknięta.EditText
nie innegoEditText
. Jak mogę to odróżnić?Odpowiedzi:
Działa to tylko wtedy, gdy
android:windowSoftInputMode
Twoja aktywność jest ustawionaadjustResize
w manifeście. Możesz użyć nasłuchiwania układu, aby sprawdzić, czy rozmiar układu głównego działania jest zmieniany za pomocą klawiatury.Do moich działań używam czegoś podobnego do następującej klasy bazowej:
Poniższe przykładowe działanie wykorzystuje to, aby ukryć widok, gdy klawiatura jest pokazana i pokazać go ponownie, gdy klawiatura jest ukryta.
Układ XML:
I aktywność:
źródło
rootLayout = (ViewGroup) findViewById(R.id.rootLayout);
od?To bułka z masłem dzięki niesamowitej bibliotece KeyboardVisibilityEvent
Kredyty dla Yasuhiro SHIMIZU
źródło
Jak zauważył Vikram w komentarzach, wykrycie, czy klawiatura programowa jest wyświetlana, czy zniknęła, jest możliwe tylko w przypadku niektórych brzydkich hacków.
Może wystarczy ustawić fokus słuchacza na edittext :
źródło
setOnFocusChangeListener
zostanie wywołany słuchacz, a następnie naciśnę, a następnie zamknie klawiaturę i ale nie kliknę innych widoków, teraz ponownie klikam ten sam edytorxt, który już jest aktywny, to co się stanie?onFocusChange()
to nie zostanie wywołane.Do aktywności:
Dla fragmentu:
źródło
android:windowSoftInputMode="adjustResize"
manifestu?Odpowiedź Jaapa nie zadziała w przypadku AppCompatActivity. Zamiast tego uzyskaj wysokość paska stanu i paska nawigacji itp. I porównaj z rozmiarem okna aplikacji.
Tak jak to:
źródło
Możesz tego spróbować:
źródło
Możesz użyć mojej funkcji rozszerzenia Rx (Kotlin).
Przykład:
źródło
dip()
igetScreenHeight()
Poniższy kod działa dla mnie,
źródło
Jeśli możesz, spróbuj rozszerzyć EditText i zastąpić metodę „onKeyPreIme”.
Jak możesz to przedłużyć:
Myślę, że ponowne obliczenie wysokości ekranu nie jest w 100% skuteczne, jak wspomniano wcześniej. Dla jasności, nadpisywanie „onKeyPreIme” nie jest wywoływane w metodach „ukrywania programowo miękkiej klawiatury”, ALE jeśli robisz to gdziekolwiek, powinieneś zastosować tam logikę „onKeyboardHidden” i nie tworzyć kompleksowych rozwiązań.
źródło
źródło
setOnFocusChangeListener
zostanie wywołany słuchacz, a następnie naciśnę, a następnie zamknie klawiaturę i ale nie kliknę innych widoków, teraz ponownie klikam ten sam edittext, który już jest aktywny, co się stanie?onfocus
słuchacz nigdy nazywają to jest ja nie patrząc którym sugerujeUżyj tej klasy,
W
Android Manifest
,android:windowSoftInputMode="adjustResize"
jest konieczne.PS - Całkowicie wzięte stąd .
źródło
W przypadku
adjustResize
i FragmentActivity zaakceptowane rozwiązanie @Jaap nie działa dla mnie.Oto moje rozwiązanie:
źródło
Innym podejściem byłoby sprawdzenie, kiedy użytkownik przestał pisać ...
Kiedy TextEdit jest aktywny (użytkownik pisze / pisał), można ukryć widoki (fokus nasłuchujący)
i użyj Handler + Runnable i nasłuchiwania zmian tekstu, aby zamknąć klawiaturę (niezależnie od jej widoczności) i wyświetlić widoki z pewnym opóźnieniem.
Najważniejszą rzeczą, na którą należy zwrócić uwagę, jest opóźnienie, którego używasz, które zależy od zawartości tych TextEdits.
źródło
Ten kod działa świetnie
użyj tej klasy jako widoku głównego:
}
i ustaw nasłuchiwanie klawiatury na aktywność lub fragment:
źródło
Możesz obsłużyć widoczność klawiatury, zastępując dwie metody w swoim działaniu:
onKeyUp()
ionKeyDown()
więcej informacji w tym linku: https://developer.android.com/training/keyboard-input/commandsźródło
Niestety nie mam wystarczająco dobrej reputacji, aby komentować odpowiedź Jaapa van Hengstuma. Ale przeczytałem kilka komentarzy ludzi, którzy mają problem, który
contentViewTop
jest zawsze0
ionShowKeyboard(...)
zawsze się nazywa.Miałem ten sam problem i zorientowałem się, jaki mam problem. Użyłem
AppCompatActivity
zamiast „normalnego”Activity
. W tym przypadkuWindow.ID_ANDROID_CONTENT
odnosi się do an,ContentFrameLayout
a nie doFrameLayout
z prawą górną wartością. W moim przypadku to było w porządku do korzystania z „normalną”Activity
, jeśli trzeba użyć innej działalności typu (ja tylko testowałemAppCompatActivity
, może to również problem z innymi acitivy typów, takich jak wybranyFragmentActivity
), trzeba uzyskać dostęp doFrameLayout
, który jest przodekContentFrameLayout
.źródło
kiedy klawiatura pokazuje
jest prawdą, inaczej ukryj
źródło
Zmodyfikowałem nieco zaakceptowaną odpowiedź Jaapa. Ale w moim przypadku założeń jest kilka takich jak
android:windowSoftInputMode=adjustResize
i klawiatura nie pojawia się na początku po uruchomieniu aplikacji. Zakładam również, że ekran pod względem odpowiada wzrostowi rodzica.contentHeight > 0
to sprawdzenie pozwala mi wiedzieć, czy odpowiedni ekran jest ukryty lub pokazany, aby zastosować nasłuchiwanie zdarzeń klawiatury dla tego konkretnego ekranu. Przekazuję również widok układu odpowiedniego ekranu w metodzieattachKeyboardListeners(<your layout view here>)
mojej głównej działalnościonCreate()
. Za każdym razem, gdy zmienia się wysokość danego ekranu, zapisuję go jakoprevContentHeight
zmienną, aby później sprawdzić, czy klawiatura jest pokazana lub ukryta.Dla mnie jak dotąd działało to całkiem nieźle. Mam nadzieję, że u innych też działa.
źródło
Odpowiedź "Jaapa van Hengstuma" działa dla mnie, ale nie ma potrzeby ustawiania "android: windowSoftInputMode", jak właśnie powiedział!
Zmniejszyłem to (teraz po prostu wykrywa to, czego chcę, a właściwie zdarzenie dotyczące pokazywania i ukrywania klawiatury):
i po prostu nie zapomnij o tym dodać
źródło
To zadziała bez konieczności zmiany Twojej aktywności
android:windowSoftInputMode
krok 1: rozszerz klasę EditText i nadpisz te dwa:
krok 2: utwórz te dwa w swoim działaniu:
*** pamiętaj, że aby
clearFocus
praca była możliwa, musisz sprawić, by rodzic lub pierwsze dziecko w hierarchii nadrzędnej podlegało koncentracji.źródło
To nie działa zgodnie z oczekiwaniami ...
... widziałem wiele obliczeń rozmiaru użytkowego do sprawdzenia ...
Chciałem ustalić, czy było otwarte, czy nie i znalazłem
isAcceptingText()
więc to naprawdę nie odpowiada na pytanie, ponieważ nie dotyczy otwierania lub zamykania, a raczej jest otwarte lub zamknięte, więc jest to powiązany kod, który może pomóc innym w różnych scenariuszach ...
w działaniu
we fragmencie
źródło
sprawdź poniższy kod:
KOD XML:
KOD JAVA:
źródło