Czy w Androidzie jest sposób na wykrycie, czy klawiatura programowa (inaczej „miękka”) jest widoczna na ekranie?
android
keyboard
android-softkeyboard
andreea
źródło
źródło
Odpowiedzi:
Nie ma bezpośredniego sposobu - patrz http://groups.google.com/group/android-platform/browse_thread/thread/1728f26f2334c060/5e4910f0d9eb898a, gdzie odpowiedziała Dianne Hackborn z zespołu Android. Można go jednak wykryć pośrednio, sprawdzając, czy rozmiar okna zmienił się w #onMeasure. Zobacz Jak sprawdzić widoczność klawiatury oprogramowania w systemie Android? .
źródło
To działa dla mnie. Może to zawsze najlepszy sposób dla wszystkich wersji .
Skuteczne byłoby uczynienie właściwości widoczności klawiatury i obserwowanie tych zmian z opóźnieniem, ponieważ metoda onGlobalLayout wywołuje wiele razy. Dobrze jest również sprawdzić obrót urządzenia i
windowSoftInputMode
tak nie jestadjustNothing
.źródło
contentView
zadeklarowane?Spróbuj tego:
źródło
Stworzyłem prostą klasę, której można użyć do tego: https://github.com/ravindu1024/android-keyboardlistener . Po prostu skopiuj go do swojego projektu i użyj:
źródło
Bardzo łatwe
1. Umieść identyfikator w widoku głównym
rootView
jest tylko widokiem wskazującym mój widok główny w tym przypadkurelative layout
:2. Zainicjuj widok główny w swojej działalności:
RelativeLayout rootView = (RelativeLayout) findViewById(R.id.addresses_confirm_root_view);
3. Sprawdź, czy klawiatura jest otwarta czy zamknięta za pomocą
getViewTreeObserver()
źródło
1
. Bez znaczenia. Tylko to musi być mniejsza niż rzeczywista długość klawiaturyUżyłem tego jako podstawy: http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
Następnie napisał tę metodę:
Następnie możesz użyć tego do przetestowania wszystkich pól (EditText, AutoCompleteTextView itp.), Które mogły otworzyć klawiaturę programową:
Wprawdzie nie jest to idealne rozwiązanie, ale wykonuje zadanie.
źródło
Możesz użyć wyniku wywołania zwrotnego programów showSoftInput () i hideSoftInput (), aby sprawdzić status klawiatury. Pełne szczegóły i przykładowy kod na
http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
źródło
Możesz odnieść się do tej odpowiedzi - https://stackoverflow.com/a/24105062/3629912
To działało dla mnie za każdym razem.
Zwróci wartość true, jeśli klawiatura oprogramowania jest widoczna.
źródło
Więc po długim czasie zabawy z usługami AccessibilityServices, wstawkami okien, wykrywaniem wysokości ekranu itp., Myślę, że znalazłem sposób, aby to zrobić.
Oświadczenie: używa ukrytej metody w Androidzie, co oznacza, że może nie być spójna. Jednak w moich testach wydaje się, że działa.
Metodą jest InputMethodManager # getInputMethodWindowVisibleHeight () i istnieje od wersji Lollipop (5.0).
Wywołanie, które zwraca wysokość bieżącej klawiatury (w pikselach). Teoretycznie klawiatura nie powinna mieć 0 pikseli wysokości, więc wykonałem prostą kontrolę wysokości (w Kotlinie):
Używam Android Hidden API, aby uniknąć odbicia, gdy wywołuję metody ukryte (robię to dużo dla aplikacji, które opracowuję, które są w większości aplikacjami typu hacky / tuner), ale powinno to być możliwe również z odbiciem:
źródło
Było to o wiele mniej skomplikowane dla potrzeb, których potrzebowałem. Mam nadzieję, że to może pomóc:
Na MainActivity:
Domyślna pierwotna wartość logiczna dla mKeyboardStatus zostanie zainicjowana na false .
Następnie sprawdź wartość w następujący sposób i w razie potrzeby wykonaj akcję:
źródło
Powinno to działać, jeśli chcesz sprawdzić stan klawiatury:
Gdzie
UiUtils.KEYBOARD_VISIBLE_THRESHOLD_DP
= 100, a dip () to funkcja anko, która konwertuje dpToPx:źródło
Zrobiłem to, ustawiając GlobalLayoutListener w następujący sposób:
źródło
Wypróbuj ten kod, który naprawdę działa, jeśli wyświetlona zostanie opcja KeyboardShown, a następnie ta funkcja zwróci prawdziwą wartość ....
źródło
W moim przypadku miałem tylko jeden
EditText
układ do zarządzania, więc wymyśliłem to rozwiązanie. Działa dobrze, w zasadzie jest to zwyczaj,EditText
który nasłuchuje fokusu i wysyła transmisję lokalną, jeśli fokus zmieni się lub jeśli zostanie naciśnięty przycisk Wstecz / Gotowe. Aby pracować, musisz umieścić manekinaView
w swoim układzie za pomocąandroid:focusable="true"
iandroid:focusableInTouchMode="true"
ponieważ podczas rozmowyclearFocus()
fokus zostanie ponownie przypisany do pierwszego widoku, który można ustawić. Przykładowy widok manekina:Dodatkowe informacje
Rozwiązanie, które wykrywa różnicę w zmianach układu, nie działa zbyt dobrze, ponieważ silnie zależy od gęstości ekranu, ponieważ 100 pikseli może być dużo w określonym urządzeniu, a w innych nie można uzyskać fałszywych wyników dodatnich. Również różni dostawcy mają różne klawiatury.
źródło
W Androidzie możesz wykryć za pomocą powłoki ADB. Napisałem i używam tej metody:
źródło
źródło
Odpowiedź @iWantScala jest świetna, ale nie działa dla mnie
rootView.getRootView().getHeight()
zawsze ma tę samą wartośćJednym ze sposobów jest zdefiniowanie dwóch zmiennych
dodaj globalny odbiornik
następnie sprawdź
działa w porządku
źródło
Wreszcie jest teraz bezpośredni sposób, zaczynając od Androida R opartego na Kotlinie.
źródło
Miałem podobny problem. Musiałem zareagować na przycisk Enter na ekranie (który ukrywał klawiaturę). W takim przypadku możesz zasubskrybować opcję OnEditorAction widoku tekstowego, z którym korzystała klawiatura - jeśli masz wiele edytowalnych pól, zasubskrybuj je wszystkie.
W swojej działalności masz pełną kontrolę nad klawiaturą, więc w żadnym momencie nie staniesz przed problemem, czy klawiatura jest otwarta, czy nie, jeśli słuchasz wszystkich zdarzeń otwierania i zamykania.
źródło
Istnieje bezpośredni sposób, aby się tego dowiedzieć. I nie wymaga zmian układu.
Działa więc również w trybie pełnego ekranu.
Ale niestety nie działa na wszystkich urządzeniach. Musisz to przetestować na swoich urządzeniach.
Sztuka polega na tym, że próbujesz ukryć lub pokazać miękką klawiaturę i uchwycić wynik tej próby.
Jeśli działa poprawnie, klawiatura nie jest tak naprawdę pokazywana ani ukryta. Po prostu pytamy o państwo.
Aby być na bieżąco, wystarczy powtórzyć tę operację, np. Co 200 milisekund, używając programu obsługi.
Poniższa implementacja wykonuje tylko jedną kontrolę.
Jeśli wykonujesz wiele kontroli, powinieneś włączyć wszystkie testy (_keyboardVisible).
źródło
Oto obejście, aby wiedzieć, czy klawiatura programowa jest widoczna.
Niektóre popularne klawiatury mają określone słowa kluczowe w swojej klasieNazwy:
W ActivityManager.RunningServiceInfo sprawdź powyższe wzorce w ClassNames. Ponadto, clientPackage = android , ActivityManager.RunningServiceInfo's = android, wskazując, że klawiatura jest powiązana z systemem.
Powyższe informacje można połączyć w celu dokładnego sprawdzenia, czy widoczna jest miękka klawiatura.
źródło
Jak zapewne wiesz, klawiatura oprogramowania Android będzie widoczna tylko wtedy, gdy możliwe jest pisanie na klawiaturze. Innymi słowy Klawiatura staje się widoczna tylko wtedy, gdy jest skoncentrowany EditText. oznacza to, że możesz uzyskać pogodę, że klawiatura jest widoczna lub nie, używając OnFocusChangeListener .
Teraz możesz użyć zmiennej isKeyBoardVisible w dowolnym miejscu w klasie, aby uzyskać pogodę, że klawiatura jest otwarta lub nie. To działało dla mnie dobrze.
Uwaga: Ten proces nie działa, gdy klawiatura jest otwierana programowo za pomocą InputMethodManager, ponieważ nie wywołuje OnFocusChangeListener.
źródło
Przekształciłem odpowiedź na kotlin, mam nadzieję, że pomoże to użytkownikom kotlin.
źródło
Działa z funkcją dostosowaniaNie są używane flagi aktywności i zdarzeń cyklu życia. Również z Kotlinem:
Przydatna metoda utrzymywania widoku zawsze nad klawiaturą
Gdzie getFullViewBounds
Gdzie getFullScreenSize
Gdzie updateMargin
źródło
Zrobiłem to w następujący sposób, ale ma to znaczenie tylko wtedy, gdy Twoim celem jest zamknięcie / otwarcie klucza.
zamknij przykład: (sprawdzenie, czy klawiatura jest już zamknięta, jeśli nie - zamknięcie)
źródło
a może używać:
źródło
Napisałem próbkę .
To repozytorium może pomóc w wykryciu stanu klawiatury bez założenia, że „klawiatura powinna być w więcej niż X części ekranu”
źródło
Jeśli w swojej aplikacji obsługujesz api dla AndroidR, możesz użyć poniższej metody.
Uwaga: ta opcja jest dostępna tylko dla systemu AndroidR, a poniżej wersja Androida musi podążać za inną odpowiedzią lub zaktualizuję ją w tym celu.
źródło