Jak zamknąć / ukryć miękką klawiaturę Androida za pomocą Javy?
Mam EditText
i Button
w moim układzie.
Po wpisaniu w polu edycji i kliknięciu na Button
, chcę ukryć wirtualną klawiaturę podczas dotykania poza klawiaturą. Zakładam, że jest to prosty fragment kodu, ale gdzie mogę znaleźć jego przykład?
30 answers
Aby wyjaśnić to szaleństwo, chciałbym zacząć od przeprosin w imieniu wszystkich użytkowników Androida za wręcz śmieszne traktowanie przez Google miękkiej klawiatury. Powodem, dla którego jest tak wiele odpowiedzi, każda inna, na to samo proste pytanie, jest to, że ten API, podobnie jak wiele innych w Androidzie, jest strasznie zaprojektowany. Nie znam grzecznego sposobu, by to wyrazić.
Chcę ukryć klawiaturę. Spodziewam się dostarczyć Androidowi następujące oświadczenie:Keyboard.hide()
. Koniec. Dziękuję bardzo. Ale Android ma problem. Musisz użyć InputMethodManager
, aby ukryć klawiaturę. Ok, dobrze, to jest API Androida do klawiatury. Ale! Aby uzyskać dostęp do IMM, wymagane jest posiadanie Context
. Teraz mamy problem. Mogę chcieć ukryć klawiaturę przed klasą statyczną lub użytkową, która nie ma żadnego użytku ani potrzeby Context
. lub, co gorsza, IMM wymaga podania, przed czym View
(lub jeszcze gorzej, przed czym Window
) chcesz ukryć klawiaturę.
To właśnie sprawia, że ukrywanie klawiatura tak trudne. Drogi Google: Kiedy patrzę na przepis na ciasto, nie ma RecipeProvider
na ziemi, która odmówiłaby mi podania przepisu, chyba że najpierw odpowiem, komu ciasto zostanie zjedzone i gdzie zostanie zjedzone!!
Ta smutna historia kończy się brzydką prawdą: aby ukryć klawiaturę Androida, będziesz musiał podać 2 formy identyfikacji: a Context
i a View
lub a Window
.
Stworzyłem statyczną metodę użytkową, która może wykonać zadanie bardzo solidnie, pod warunkiem, że zadzwonisz z Activity
.
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
//Find the currently focused view, so we can grab the correct window token from it.
View view = activity.getCurrentFocus();
//If no view currently has focus, create a new one, just so we can grab a window token from it
if (view == null) {
view = new View(activity);
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
Należy pamiętać, że ta metoda użytkowa działa tylko wtedy, gdy jest wywoływana z Activity
! Powyższa metoda wywołuje getCurrentFocus
Z celu Activity
, Aby pobrać właściwy token okna.
Ale załóżmy, że chcesz ukryć klawiaturę przed EditText
hostowanym w DialogFragment
? Nie możesz użyć do tego powyższej metody:
hideKeyboard(getActivity()); //won't work
To nie zadziała, ponieważ będziesz przekazywał odniesienie do Fragment
's host Activity
, który nie będzie miał skupionej kontroli podczas gdy Fragment
jest pokazany! Wow! Dlatego, aby ukryć klawiaturę przed fragmentami, uciekam się do niższego poziomu, bardziej powszechnego i brzydkiego:
public static void hideKeyboardFrom(Context context, View view) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
Poniżej kilka dodatkowych informacji zebranych z więcej czasu straconego na szukanie tego rozwiązania:
O windowSoftInputMode
Jest jeszcze jeden punkt sporny, o którym należy pamiętać. Domyślnie Android automatycznie przypisze początkową ostrość do pierwszego EditText
lub kontrolki z możliwością ustawiania ostrości w twoim Activity
. Naturalnie wynika z tego, że InputMethod (zazwyczaj miękka klawiatura) zareaguje na zdarzenie focus, pokazując się. Atrybut windowSoftInputMode
w AndroidManifest.xml
, Po ustawieniu na stateAlwaysHidden
, nakazuje klawiaturze ignorowanie automatycznie przypisanego początkowego Fokusa.
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
Wydaje się prawie niewiarygodnie, że nie robi nic, aby uniemożliwić otwarcie klawiatury po dotknięciu kontrolki (chyba że focusable="false"
i/lub focusableInTouchMode="false"
są przypisane do kontrolki). Widocznie ustawienie windowSoftInputMode dotyczy tylko automatycznych zdarzeń ostrości, a nie zdarzenia ostrości wywołane przez zdarzenia dotykowe.
Dlatego, stateAlwaysHidden
jest bardzo źle nazwany. Zamiast tego powinno się go nazywać ignoreInitialFocus
.
Aktualizacja: więcej sposobów na uzyskanie tokena okna
Jeśli nie ma widoku zogniskowanego (np. może się zdarzyć, jeśli po prostu zmieniłeś fragmenty), istnieją inne widoki, które dostarczą użyteczny token okna.
Są to alternatywy dla powyższego kodu if (view == null) view = new View(activity);
te nie odnoszą się wprost do twojego aktywność.
Wewnątrz klasy fragment:
view = getView().getRootView().getWindowToken();
Podano fragment fragment
jako parametr:
view = fragment.getView().getRootView().getWindowToken();
Począwszy od treści ciała:
view = findViewById(android.R.id.content).getRootView().getWindowToken();
Aktualizacja 2: Wyczyść ostrość, aby uniknąć ponownego wyświetlania klawiatury, jeśli otworzysz aplikację z tła
Dodaj ten wiersz na końcu metody:
view.clearFocus();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-01 09:12:47
Możesz wymusić na Androidzie ukrycie wirtualnej klawiatury za pomocą InputMethodManager , wywołując hideSoftInputFromWindow
, przechodzenie w token okna zawierającego fokusowany widok.
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
Wymusi to ukrycie klawiatury we wszystkich sytuacjach. W niektórych przypadkach będziesz chciał podać InputMethodManager.HIDE_IMPLICIT_ONLY
jako drugi parametr, aby upewnić się, że ukrywasz klawiaturę tylko wtedy, gdy użytkownik nie wymusi jej wyświetlenia(przytrzymując menu).
Uwaga: jeśli chcesz to w Kotlinie, użyj:
context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
Składnia Kotlina
// Check if no view has focus:
val view = this.currentFocus
view?.let { v ->
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
imm?.hideSoftInputFromWindow(v.windowToken, 0)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-28 19:05:25
Przydatne również do ukrywania soft-keyboardu jest:
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
To może być używane do wyłączania miękkiej klawiatury, dopóki użytkownik nie dotknie widoku editText.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-24 16:07:40
Mam jeszcze jedno rozwiązanie do ukrycia klawiatury:
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
Tutaj mijamy HIDE_IMPLICIT_ONLY
na pozycji showFlag
i 0
na pozycji hiddenFlag
. Będzie mocno zamknąć miękką klawiaturę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 15:26:34
Rozwiązanie Meiera też działa. W moim przypadku najwyższym poziomem mojej aplikacji jest host karty i chcę ukryć słowo kluczowe podczas przełączania kart-dostaję token okna z widoku hosta karty.
tabHost.setOnTabChangedListener(new OnTabChangeListener() {
public void onTabChanged(String tabId) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-11 04:18:02
Proszę wypróbować poniższy kod w onCreate()
EditText edtView = (EditText) findViewById(R.id.editTextConvertValue);
edtView.setInputType(InputType.TYPE_NULL);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-08 22:15:31
Update: Nie wiem dlaczego to rozwiązanie już nie działa ( właśnie testowałem na Androidzie 23). Zamiast tego należy użyć roztworu Saurabh Pareek. Tutaj jest:
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
Stara ODPOWIEDŹ:
//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:54
protected void hideSoftKeyboard(EditText input) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-28 10:55:30
Jeśli wszystkie inne odpowiedzi nie działają dla ciebie tak, jak byś chciał, istnieje inny sposób ręcznego sterowania klawiaturą.
Utwórz funkcję, która będzie zarządzać niektórymi właściwościami EditText
:
public void setEditTextFocus(boolean isFocused) {
searchEditText.setCursorVisible(isFocused);
searchEditText.setFocusable(isFocused);
searchEditText.setFocusableInTouchMode(isFocused);
if (isFocused) {
searchEditText.requestFocus();
}
}
Następnie upewnij się, że onFocus z EditText
otwierasz/zamykasz klawiaturę:
searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (v == searchEditText) {
if (hasFocus) {
// Open keyboard
((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
} else {
// Close keyboard
((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
}
}
}
});
Teraz, gdy chcesz ręcznie otworzyć klawiaturę, zadzwoń:
setEditTextFocus(true);
I na zakończenie rozmowy:
setEditTextFocus(false);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-24 15:55:42
Saurabh Pareek ma najlepszą jak dotąd odpowiedź.
Równie dobrze można użyć poprawnych FLAG.
/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
Przykład rzeczywistego użycia
/* click button */
public void onClick(View view) {
/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
/* start loader to check parameters ... */
}
/* loader finished */
public void onLoadFinished(Loader<Object> loader, Object data) {
/* parameters not valid ... */
/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
/* parameters valid ... */
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:19
Z tak poszukiwanych, tutaj znalazłem odpowiedź, która działa dla mnie
// Show soft-keyboard:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
// Hide soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-24 21:09:51
Krótka odpowiedź
In your OnClick
listener call the onEditorAction
of the EditText
with IME_ACTION_DONE
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
}
});
The drill-down
Uważam, że ta metoda jest lepsza, prostsza i bardziej dostosowana do wzorca projektowego Androida.
W prostym przykładzie powyżej (i zazwyczaj w większości typowych przypadków) będziesz miał EditText
, który miał/miał fokus i to również zwykle był ten, który wywołał klawiaturę w pierwszej kolejności (na pewno jest w stanie wywołać ją w wielu typowych scenariuszach). W ten sam sposób, to powinien być ten, który zwolni klawiaturę, zwykle można to zrobić za pomocą ImeAction
. Po prostu zobacz, jak zachowuje się EditText
z android:imeOptions="actionDone"
, chcesz osiągnąć to samo zachowanie za pomocą tych samych środków.
Sprawdź to odpowiedź pokrewna
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:54
To powinno zadziałać:
public class KeyBoard {
public static void show(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
}
public static void hide(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
}
public static void toggle(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm.isActive()){
hide(activity);
} else {
show(activity);
}
}
}
KeyBoard.toggle(activity);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-15 14:51:17
Używam niestandardowej klawiatury, aby wprowadzić numer szesnastkowy, więc nie mogę mieć klawiatury IMM...
W v3.2.4_r1setSoftInputShownOnFocus(boolean show)
został dodany do sterowania pogodą lub nie, aby wyświetlać klawiaturę, gdy TextView zostanie ustawiony ostrość, ale nadal jest ukryty, więc należy użyć odbicia:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
try {
Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
method.invoke(mEditText, false);
} catch (Exception e) {
// Fallback to the second method
}
}
Dla starszych wersji uzyskałem bardzo dobre wyniki (ale dalekie od ideału) z OnGlobalLayoutListener
, dodanym przy pomocy ViewTreeObserver
z widoku głównego, a następnie sprawdzając, czy klawiatura jest pokazana jak to:
@Override
public void onGlobalLayout() {
Configuration config = getResources().getConfiguration();
// Dont allow the default keyboard to show up
if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0);
}
}
To ostatnie rozwiązanie może wyświetlać klawiaturę przez ułamek sekundy i mieszać z uchwytami wyboru.
Gdy na klawiaturze wchodzi Pełny ekran, onGlobalLayout nie jest wywoływany. Aby tego uniknąć, użyj TextView#setImeOptions (int) lub w deklaracji XML TextView:
android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"
Update: właśnie znalazłem, czego okna dialogowe używają, aby nigdy nie pokazywać klawiatury i działa we wszystkich wersjach:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-28 20:48:33
public void setKeyboardVisibility(boolean show) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(show){
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}else{
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-01 13:36:12
Spędziłem ponad dwa dni pracując nad wszystkimi rozwiązaniami zamieszczonymi w wątku i znalazłem ich brak w taki czy inny sposób. Moim dokładnym wymogiem jest posiadanie przycisku, który ze 100% niezawodnością pokaże lub ukryje klawiaturę ekranową. Gdy klawiatura jest w stanie ukrytym nie powinna pojawić się ponownie, Bez względu na to, jakie pola wejściowe kliknie użytkownik. Gdy jest w widocznym stanie, klawiatura nie powinna znikać bez względu na to, jakie przyciski kliknie użytkownik. To musi pracuj na Androidzie 2.2+ aż do najnowszych urządzeń.
Możesz zobaczyć działającą implementację tego w mojej aplikacji clean RPN .
Po przetestowaniu wielu sugerowanych odpowiedzi na wielu różnych telefonach (w tym na urządzeniach froyo i Gingerbread) okazało się, że aplikacje na Androida mogą niezawodnie:
- tymczasowo ukryj klawiaturę. Pojawi się ponownie, gdy użytkownik skupia nowe pole tekstowe.
- Pokaż klawiaturę, gdy zaczyna się czynność oraz Ustaw flagę na aktywności wskazującą, że powinny zawsze bądź widoczny. Flaga ta może być ustawiona tylko wtedy, gdy aktywność jest inicjuję.
- zaznacz działanie, aby nigdy nie pokazywać ani nie zezwalać na korzystanie z klawiatura. Flaga ta może być ustawiona tylko wtedy, gdy aktywność jest inicjuję.
Dla mnie chwilowe ukrycie klawiatury to za mało. Na niektórych urządzeniach pojawi się ponownie, gdy tylko nowe pole tekstowe zostanie skupione. Ponieważ moja aplikacja używa wielu pól tekstowych na jednej stronie, skupiając nowy pole tekstowe spowoduje ponowne pojawienie się ukrytej klawiatury.
Niestety pozycja 2 i 3 na liście działa tylko wtedy, gdy aktywność jest uruchamiana. Gdy aktywność stanie się widoczna, nie można trwale ukryć ani pokazać klawiatury. Sztuczka polega na ponownym uruchomieniu 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:
private void toggleKeyboard(){
if(keypadPager.getVisibility() == View.VISIBLE){
Intent i = new Intent(this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
Bundle state = new Bundle();
onSaveInstanceState(state);
state.putBoolean(SHOW_KEYBOARD, true);
i.putExtras(state);
startActivity(i);
}
else{
Intent i = new Intent(this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
Bundle state = new Bundle();
onSaveInstanceState(state);
state.putBoolean(SHOW_KEYBOARD, false);
i.putExtras(state);
startActivity(i);
}
}
Powoduje to bieżącą aktywność aby jego stan został zapisany w pakiecie, a następnie aktywność jest uruchamiana, przechodząc przez logikę, która wskazuje, czy klawiatura powinna być pokazana lub ukryta.
Wewnątrz metody onCreate uruchamiany jest następujący kod:
if(bundle.getBoolean(SHOW_KEYBOARD)){
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}
Jeśli miękka klawiatura ma być pokazana, wtedy Menedżer InputMethodManager ma pokazywać klawiaturę, a okno jest poinstruowane, aby miękkie wejście było zawsze widoczne. Jeśli miękka klawiatura powinna być ukryta, to WindowManager.LayoutParams.Ustawiono 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 systemem 4.2.2. Jedyną wadą tego podejścia jest to, że trzeba być ostrożnym z obsługą przycisku Wstecz. Ponieważ moja aplikacja zasadniczo ma tylko jeden ekran (jego Kalkulator) mogę zastąpić onbackpressed() i wrócić do ekranu głównego urządzenia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-06 07:10:29
Alternatywnie do To rozwiązanie , Jeśli chcesz zamknąć miękką klawiaturę z dowolnego miejsca bez odniesienia do pola (EditText), które zostało użyte do otwarcia klawiatury, ale nadal chcesz to zrobić, jeśli pole jest skupione, możesz użyć tego (z aktywności):
if (getCurrentFocus() != null) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:54
Dzięki this SO answer , uzyskałem następujące, które w moim przypadku działają ładnie podczas przewijania fragmentów Viewpagera...
private void hideKeyboard() {
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
private void showKeyboard() {
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:58
Powyższe odpowiedzi działają dla różnych scenariuszy, ale Jeśli chcesz ukryć klawiaturę wewnątrz widoku i walczyć o odpowiedni kontekst, spróbuj tego:
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
hideSoftKeyBoardOnTabClicked(v);
}
}
private void hideSoftKeyBoardOnTabClicked(View v) {
if (v != null && context != null) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
I aby uzyskać kontekst pobierz go z konstruktora:)
public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
init();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-24 21:10:37
Jeśli chcesz zamknąć miękką klawiaturę podczas testu urządzenia lub funkcji, możesz to zrobić, klikając przycisk "Wstecz" z testu:
// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
Umieszczam "przycisk Wstecz" w cudzysłowach, ponieważ powyższe nie uruchamia onBackPressed()
dla danej aktywności. Po prostu zamyka klawiaturę.
Upewnij się, że zatrzymasz się na chwilę przed przejściem, ponieważ zamknięcie przycisku back zajmuje trochę czasu, więc kolejne kliknięcia do widoków itp., zostanie zarejestrowany dopiero po krótkiej przerwie (1 drugi jest wystarczająco długi ime).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-13 21:55:41
W tym celu należy wykonać następujące czynności:]}
InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-15 01:36:10
To działało dla mnie na wszystkie dziwne zachowanie klawiatury
private boolean isKeyboardVisible() {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
mRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top);
return heightDiff > 100; // if more than 100 pixels, its probably a keyboard...
}
protected void showKeyboard() {
if (isKeyboardVisible())
return;
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (getCurrentFocus() == null) {
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
} else {
View view = getCurrentFocus();
inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
}
}
protected void hideKeyboard() {
if (!isKeyboardVisible())
return;
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
View view = getCurrentFocus();
if (view == null) {
if (inputMethodManager.isAcceptingText())
inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
} else {
if (view instanceof EditText)
((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-24 21:11:16
Prosta i łatwa w użyciu metoda, wystarczy wywołać hideKeyboardFrom(your activity.to); aby ukryć klawiaturę
/**
* This method is used to hide keyboard
* @param activity
*/
public static void hideKeyboardFrom(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-21 06:52:20
Dodaj do swojej aktywności android:windowSoftInputMode="stateHidden"
w pliku Manifest. Przykład:
<activity
android:name=".ui.activity.MainActivity"
android:label="@string/mainactivity"
android:windowSoftInputMode="stateHidden"/>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-04 12:21:40
Dla Klawiatury Otwartej:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edtView, InputMethodManager.SHOW_IMPLICIT);
Dla Klawiatury Close/Hide:
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edtView.getWindowToken(), 0);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-05 12:39:18
Po prostu użyj tego zoptymalizowanego kodu w swojej aktywności:
if (this.getCurrentFocus() != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-24 21:11:54
Mam przypadek, w którym moje EditText
może znajdować się również w AlertDialog
, więc klawiatura powinna być zamknięta po zwolnieniu. Poniższy kod wydaje się działać wszędzie:
public static void hideKeyboard( Activity activity ) {
InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE );
View f = activity.getCurrentFocus();
if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) )
imm.hideSoftInputFromWindow( f.getWindowToken(), 0 );
else
activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-24 21:12:20
Działa jak magiczny dotyk za każdym razem
private void closeKeyboard() {
InputMethodManager inputManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
private void openKeyboard() {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-03 13:18:25
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
Po tym wezwaniu na onTouchListener:
findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Utils.hideSoftKeyboard(activity);
return false;
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-18 04:40:42
Użyj tego
this.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 13:42:00