Mam A EditText
i A Button
w moim układzie.
Po wpisaniu w polu edycji i kliknięciu przycisku Button
chcę ukryć wirtualną klawiaturę. Zakładam, że jest to prosty fragment kodu, ale gdzie mogę znaleźć przykład?
Podczas dotykania poza klawiaturą.
Mam A EditText
i A Button
w moim układzie.
Po wpisaniu w polu edycji i kliknięciu przycisku Button
chcę ukryć wirtualną klawiaturę. Zakładam, że jest to prosty fragment kodu, ale gdzie mogę znaleźć przykład?
Podczas dotykania poza klawiaturą.
Odpowiedzi:
Aby pomóc wyjaśnić to szaleństwo, chciałbym zacząć od przeprosin w imieniu wszystkich użytkowników Androida za wręcz absurdalne traktowanie przez Google miękkiej klawiatury. Powodem jest tak wiele odpowiedzi, z których każda jest inna, na to samo proste pytanie, ponieważ ten interfejs API, podobnie jak wiele innych w Androidzie, jest strasznie zaprojektowany. Nie potrafię wymyślić żadnego grzecznego sposobu na wyrażenie tego.
Chcę ukryć klawiaturę. Spodziewam się, aby zapewnić Android z następującym stwierdzeniem:
Keyboard.hide()
. Koniec. Dziękuję Ci bardzo. Ale Android ma problem. Musisz użyć,InputMethodManager
aby ukryć klawiaturę. OK, w porządku, to jest interfejs API Androida do klawiatury. ALE! Musisz miećContext
, aby uzyskać dostęp do IMM. Teraz mamy problem. Mogę chcieć ukryć klawiaturę przed klasą statyczną lub użytkową, która nie jest potrzebna ani potrzebnaContext
. lub I DALEKO gorzej, IMM wymaga określenia, coView
(lub jeszcze gorzej, coWindow
) chcesz ukryć przed klawiaturą.Właśnie dlatego ukrywanie klawiatury jest tak trudne. Drogi Google: Kiedy szukam przepisu na ciasto, nie ma
RecipeProvider
na Ziemi która nie odmówiłaby podania mi przepisu, chyba że najpierw odpowiem KTO, przez co ciasto zostanie zjedzone ORAZ gdzie zostanie zjedzone !!Ta smutna historia kończy się brzydką prawdą: aby ukryć klawiaturę Androida, musisz podać 2 formy identyfikacji: a
Context
i aView
lub aWindow
.Stworzyłem statyczną metodę narzędzia, która może wykonać zadanie BARDZO solidnie, pod warunkiem, że wywołasz go z
Activity
.Należy pamiętać, że ta metoda narzędzia działa TYLKO po wywołaniu z
Activity
! Powyższe wywołania metodygetCurrentFocus
celu wActivity
celu pobrania odpowiedniego tokena okna.Ale załóżmy, że chcesz ukryć klawiaturę przed
EditText
hostowanym wDialogFragment
? Nie możesz użyć powyższej metody do tego:To nie zadziała, ponieważ przekażesz referencję do
Fragment
hostaActivity
, który nie będzie miał żadnej skoncentrowanej kontroli, gdyFragment
zostanie wyświetlony! Łał! Aby ukryć klawiaturę przed fragmentami, uciekam się do niższego poziomu, bardziej powszechnego i brzydszego:Poniżej znajduje się kilka dodatkowych informacji zebranych po dłuższym marnowaniu czasu na pogoń za tym rozwiązaniem:
Informacje o windowSoftInputMode
Jest jeszcze jeden punkt sporny, o którym należy pamiętać. Domyślnie Android automatycznie przypisze początkowy fokus do pierwszej
EditText
lub sterowalnej fokusu w twoimActivity
. Wynika z tego naturalnie, że InputMethod (zazwyczaj miękka klawiatura) zareaguje na zdarzenie skupienia, pokazując się.windowSoftInputMode
AtrybutAndroidManifest.xml
, gdy ustawionystateAlwaysHidden
, instruuje klawiaturę do ignorowania tego automatycznie przypisany początkowej ostrości.Niemal niewiarygodne wydaje się, że nie robi nic, aby uniemożliwić otwarcie klawiatury po dotknięciu kontrolki (chyba że
focusable="false"
i / lubfocusableInTouchMode="false"
są przypisane do kontrolki). Najwyraźniej ustawienie windowSoftInputMode dotyczy tylko zdarzeń automatycznego fokusa, a nie zdarzeń fokusa wyzwalanych przez zdarzenia dotykowe.Dlatego
stateAlwaysHidden
jest BARDZO źle nazwany. Być może należy to nazwaćignoreInitialFocus
zamiast tego.Mam nadzieję że to pomoże.
AKTUALIZACJA: Więcej sposobów na uzyskanie tokena okna
Jeśli nie ma skupionego widoku (np. Może się zdarzyć, jeśli właśnie zmieniłeś fragmenty), istnieją inne widoki, które dostarczą przydatnego tokena okna.
Są to alternatywy dla powyższego kodu.
if (view == null) view = new View(activity);
Nie odnoszą się one wprost do Twojej aktywności.Wewnątrz klasy fragmentu:
Biorąc pod uwagę fragment
fragment
jako parametr:Począwszy od treści treści:
AKTUALIZACJA 2: Wyczyść fokus, aby uniknąć ponownego wyświetlania klawiatury, jeśli otworzysz aplikację z tła
Dodaj ten wiersz na końcu metody:
view.clearFocus();
źródło
Fragment
Wydaje się, że możesz użyćgetActivity().getWindow().getDecorView()
Keyboard.hide();
narzędzieMożesz zmusić Androida do ukrycia wirtualnej klawiatury za pomocą InputMethodManager , wywołując
hideSoftInputFromWindow
, przekazując token okna zawierającego skupiony widok.Wymusi to ukrycie klawiatury we wszystkich sytuacjach. W niektórych przypadkach będziesz chciał przekazać
InputMethodManager.HIDE_IMPLICIT_ONLY
jako drugi parametr, aby mieć pewność, że ukryjesz klawiaturę tylko wtedy, gdy użytkownik nie wymusił jej jawnego wyświetlenia (przytrzymując menu).Uwaga: Jeśli chcesz to zrobić w Kotlin, użyj:
context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
Składnia Kotlina
źródło
editText.clearFocus()
wtedyInputMethodManager.HIDE_IMPLICIT_ONLY
działa nawet dalej4.1
View focused = getCurrentFocus()
na uzyskaniu tego, co zdecydowanie jest aktualnie skupionym widokiem, wywoływaniemfocused.clearFocus()
, a następnieinputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)
(z wyraźnymi flagami).Przydatne również do ukrywania klawiatury programowej jest:
Można tego użyć, aby wyłączyć klawiaturę ekranową, dopóki użytkownik nie dotknie widoku edycji tekstu.
źródło
Mam jeszcze jedno rozwiązanie, aby ukryć klawiaturę:
Tutaj przechodzą
HIDE_IMPLICIT_ONLY
w pozycjishowFlag
i0
w pozycjihiddenFlag
. Mocno zamknie miękką klawiaturę.źródło
Rozwiązanie Meiera również działa dla mnie. W moim przypadku najwyższym poziomem mojej aplikacji jest tabHost i chcę ukryć słowo kluczowe podczas przełączania kart - otrzymuję token okna z widoku tabHost.
źródło
Spróbuj tego poniżej kodu w
onCreate()
źródło
editView.setInputType(InputType.TYPE_NULL);
Aktualizacja: Nie wiem, dlaczego to rozwiązanie już nie działa (właśnie testowałem na Androidzie 23). Zamiast tego skorzystaj z rozwiązania Saurabh Pareek . Oto on:
Stara odpowiedź:
źródło
I don't know why this solution is not work any more
- ponieważ jest to Android , wszystko będzie w stanie się zmienić, być może częściowo złego projektu ... Piszemy niedbale, a następnie przekreślamy wszystko i przepisujemy wszystko.źródło
input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
.input.setInputType(0);
z tego kodu. Zmieniło zachowanie klawiatury iinputType
dlaEditText
.Jeśli wszystkie inne odpowiedzi tutaj nie działają tak, jak chcesz, istnieje inny sposób ręcznego sterowania klawiaturą.
Utwórz funkcję, która będzie zarządzać niektórymi
EditText
właściwościami:Następnie upewnij się, że onFocus
EditText
ciebie otwiera / zamyka klawiaturę:Teraz, gdy chcesz ręcznie otworzyć klawiaturę, zadzwoń:
I do zakończenia połączenia:
źródło
Saurabh Pareek ma najlepszą jak dotąd odpowiedź.
Może jednak również użyć poprawnych flag.
Przykład rzeczywistego użycia
źródło
fragment.getActivity().getSystemService();
po tak poszukiwaniach znalazłem odpowiedź, która działa dla mnie
źródło
Krótka odpowiedź
W swoim
OnClick
słuchaczu zadzwońonEditorAction
zaEditText
pomocąIME_ACTION_DONE
Drążenie w dół
Wydaje mi się, że ta metoda jest lepsza, prostsza i bardziej zgodna ze wzorcem projektowym Androida. W powyższym prostym przykładzie (i zwykle w większości typowych przypadków) będziesz mieć,
EditText
który był / miał fokus, a także zwykle to on w pierwszej kolejności wywoływał klawiaturę (zdecydowanie jest w stanie wywołać ją w wielu przypadkach typowe scenariusze). W tej samej drodze, to powinno być jedno, aby zwolnić klawiaturę, zazwyczaj, które mogą być wykonywane przezImeAction
. Zobacz, jak toEditText
działaandroid:imeOptions="actionDone"
zachowuje się „ , i chcesz osiągnąć to samo zachowanie w ten sam sposób.Sprawdź tę powiązaną odpowiedź
źródło
To powinno działać:
źródło
hide()
ishow()
metodami, aby mieć większą kontrolę nad tym, kiedy powinna się ona pokazywać, a kiedy nie. Działa dla mnie, ja też to zrobiłem :)KeyBoard.toggle(fragment.getActivity())
Fragment
, jak w komentarzu. Dowiedz się, jak korzystać z metod, a następnie wróć.Używam niestandardowej klawiatury do wprowadzenia numeru szesnastkowego, więc nie mogę wyświetlić klawiatury IMM ...
W wersji 3.2.4_r1
setSoftInputShownOnFocus(boolean show)
dodano, aby kontrolować pogodę lub nie wyświetlać klawiatury, gdy obiekt TextView zostanie ustawiony, ale nadal jest ukryty, więc należy użyć odbicia:W przypadku starszych wersji uzyskałem bardzo dobre wyniki (ale dalekie od ideału) za pomocą a
OnGlobalLayoutListener
, dodanego za pomocą aViewTreeObserver
z mojego widoku głównego, a następnie sprawdzenia, czy klawiatura jest wyświetlana w następujący sposób:To ostatnie rozwiązanie może pokazywać klawiaturę na ułamek sekundy i zadziera z uchwytami wyboru.
Kiedy na klawiaturze pojawia się pełny ekran, onGlobalLayout nie jest wywoływany. Aby tego uniknąć, użyj TextView # setImeOptions (int) lub w deklaracji XML TextView :
Aktualizacja: Właśnie znalazłem okna dialogowe, które nigdy nie pokazują klawiatury i działają we wszystkich wersjach:
źródło
źródło
Spędziłem ponad dwa dni pracując nad wszystkimi rozwiązaniami opublikowanymi w wątku i stwierdziłem, że brakuje im w ten czy inny sposób. Moim dokładnym wymaganiem jest mieć przycisk, który ze 100% niezawodnością pokaże lub ukryje klawiaturę ekranową. Gdy klawiatura jest w stanie ukrytym, nie powinna się ponownie pojawiać, bez względu na pola wejściowe, które kliknie użytkownik. Gdy jest w stanie widocznym, klawiatura nie powinna zniknąć bez względu na to, jakie przyciski użytkownik kliknie. To musi działać na Androidzie 2.2+ aż do najnowszych urządzeń.
Możesz zobaczyć działającą implementację tego w mojej aplikacji czystym RPN .
Po przetestowaniu wielu sugerowanych odpowiedzi na wielu różnych telefonach (w tym na urządzeniach froyo i piernikowych) stało się jasne, że aplikacje na Androida mogą niezawodnie:
Dla mnie chwilowe ukrywanie klawiatury nie wystarczy. Na niektórych urządzeniach pojawi się ponownie, gdy tylko nowe pole tekstowe zostanie zogniskowane. Ponieważ moja aplikacja korzysta z wielu pól tekstowych na jednej stronie, skupienie nowego pola tekstowego spowoduje ponowne pojawienie się ukrytej klawiatury.
Niestety pozycje 2 i 3 na liście działają tylko wtedy, gdy działanie jest rozpoczęte. Gdy aktywność stanie się widoczna, nie można trwale ukryć ani pokazać klawiatury. Sztuką jest zrestartowanie aktywności, gdy użytkownik naciśnie przycisk przełączania klawiatury. W mojej aplikacji, gdy użytkownik naciśnie przycisk przełączania klawiatury, uruchamia się następujący kod:
Powoduje to, że bieżąca aktywność zostaje zapisana w pakiecie, a następnie aktywność jest uruchamiana, przechodząc przez wartość logiczną, która wskazuje, czy klawiatura powinna być pokazana, czy ukryta.
Wewnątrz metody onCreate uruchamiany jest następujący kod:
Jeśli powinna zostać wyświetlona klawiatura programowa, wówczas InputMethodManager ma wyświetlać klawiaturę, a okno jest instruowane, aby program był zawsze widoczny. Jeśli miękka klawiatura powinna być ukryta, wówczas ustawiany jest WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM.
To podejście działa niezawodnie na wszystkich urządzeniach, na których testowałem - od 4-letniego telefonu HTC z Androidem 2.2 do Nexusa 7 z 4.2.2. Jedyną wadą tego podejścia jest ostrożność przy posługiwaniu się przyciskiem Wstecz. Ponieważ moja aplikacja zasadniczo ma tylko jeden ekran (jest to kalkulator), mogę zastąpić onBackPressed () i wrócić do ekranu głównego urządzeń.
źródło
Alternatywnie do tego wszechstronnego rozwiązania , jeśli chcesz zamknąć klawiaturę programową z dowolnego miejsca bez odniesienia do pola (EditText), które było użyte do otwarcia klawiatury, ale nadal chciałbyś to zrobić, jeśli pole było skupione, możesz użyć to (z działania):
źródło
Dzięki tej odpowiedzi SO wyprowadziłem następujące, które w moim przypadku działa ładnie podczas przewijania fragmentów ViewPager ...
źródło
Powyższe odpowiedzi działają w różnych scenariuszach, ale jeśli chcesz ukryć klawiaturę w widoku i próbujesz uzyskać właściwy kontekst, spróbuj tego:
i pobierz kontekst, pobierz go z konstruktora :)
źródło
Jeśli chcesz zamknąć klawiaturę programową podczas testu jednostkowego lub funkcjonalnego, możesz to zrobić, klikając przycisk „Wstecz” w teście:
W cudzysłowie wstawiam „przycisk Wstecz”, ponieważ powyższe nie uruchamia
onBackPressed()
danego działania. Po prostu zamyka klawiaturę.Pamiętaj, aby zatrzymać się na chwilę przed przejściem dalej, ponieważ zamknięcie przycisku wstecz zajmuje trochę czasu, więc kolejne kliknięcia w Widoki itp. Nie zostaną zarejestrowane, dopóki nie nastąpi krótka pauza (1 sekunda jest wystarczająco długa ).
źródło
Oto jak to robisz w Mono na Androida (AKA MonoDroid)
źródło
searchbox
we fragmencie?To zadziałało w przypadku wszystkich dziwnych zachowań klawiatury
źródło
Dodaj do swojej aktywności
android:windowSoftInputMode="stateHidden"
w pliku manifestu. Przykład:źródło
Prosta i łatwa w użyciu metoda, wystarczy wywołać hideKeyboardFrom (YourActivity.this); ukryć klawiaturę
źródło
Po prostu użyj tego zoptymalizowanego kodu w swojej działalności:
źródło
po tym wywołaniu onTouchListener:
źródło
Użyj tego
źródło
W moim przypadku korzystałem z SearchView na pasku akcji. Po przeprowadzeniu wyszukiwania przez użytkownika klawiatura ponownie się otworzy.
Użycie InputMethodManager nie zamknęło klawiatury. Musiałem wyczyścić Focus i ustawić fokus widoku wyszukiwania na false:
źródło
clearFocus()
na stronach interfejsu API Androida, więc nie działało to dla mnie, ale zadziałało inne rozwiązanie (patrz moja odpowiedź poniżej).Mam skrzynkę, w której mój
EditText
może być umieszczony również wAlertDialog
, więc klawiatura powinna być zamknięta po zwolnieniu. Następujący kod wydaje się działać wszędzie:źródło
Prawie wypróbowałem wszystkie te odpowiedzi, miałem kilka przypadkowych problemów, szczególnie z Samsung Galaxy S5.
Skończyło się na wymuszeniu pokazu i ukrycia, i działa idealnie:
źródło