Zapobiegaj wyświetlaniu się klawiatury po rozpoczęciu aktywności

265

Mam aktywność z Edit Textwkładem. Po zainicjowaniu działania wyświetlana jest klawiatura systemu Android. W jaki sposób klawiatura może pozostać ukryta, dopóki użytkownik nie skoncentruje danych wejściowych?

Fcoder
źródło
93
w twoim manifeście<activity android:windowSoftInputMode="stateHidden" ...>
idiottiger
1
Jak używać razem z android:windowSoftInputMode="adjustPan"?
János
4
@ János android: windowSoftInputMode = "adjustPan | stateHidden"
Alexey
odpowiedzią w tym komentarzu była odpowiedź, której szukam: stackoverflow.com/a/23605510/6942602
korchix,

Odpowiedzi:

436

Myślę, że następujące mogą działać

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

Użyłem tego wcześniej do tego rodzaju rzeczy.

Lucas
źródło
Czy istnieje sposób, aby ustawić go jako klawiaturę zawierającą tylko cyfry? tj. klawiatura 12Key?
Mohamed Khamis
@MohamedKhamis input.setRawInputType (Configuration.KEYBOARD_12KEY);
blockwala
1
Tak, to nadal działa. @SagarNayak dlaczego chcesz ukryć klawiaturę EditText? :) Ma to ukryć klawiaturę, gdy zaczyna się aktywność, która zawieraEditText
Martynas
@Devealte 7 lat później i zadziałało dla mnie, czy umieściłeś go w programie onCreate?
Dymas
@Dymas Tak, a ja naprawiłem to kilka miesięcy temu :)
Devealte
180

Spróbuj tego także -

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

W przeciwnym razie zadeklaruj w aktywności pliku manifestu -

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
          android:label="@string/app_name"
          android:windowSoftInputMode="stateHidden"
          >

Jeśli używasz już android:windowSoftInputModewartości takiej jak adjustResizelub adjustPan, możesz połączyć dwie wartości, takie jak:

<activity
        ...
        android:windowSoftInputMode="stateHidden|adjustPan"
        ...
        >

Spowoduje to ukrycie klawiatury w razie potrzeby, ale przesunie widok aktywności na wypadek, gdyby klawiatura musiała zostać pokazana.

Praveenkumar
źródło
3
dzięki za pokazanie zarówno w kodzie, jak i xml! Rzeczywiście, jest to najbardziej poprawna odpowiedź! Zwłaszcza, że ​​prawdopodobnie upłynęły 3 minuty na napisaniu obu metod, które sprawiły, że nie byłeś pierwszy ;-)
eric
34

Ukryj go dla wszystkich działań wykorzystujących motyw

<style name="MyTheme" parent="Theme">
    <item name="android:windowSoftInputMode">stateHidden</item>
</style>

ustaw motyw

<application android:theme="@style/MyTheme">
dira
źródło
jak to globalne podejście.
Rm558,
1
To działało, ponieważ korzystałem z różnych motywów w różnych miejscach
nmxprime
22

Dodaj te dwie właściwości do układu nadrzędnego (np. Układ liniowy, układ względny)

android:focusable="false"
android:focusableInTouchMode="false" 

To załatwi sprawę :)

Król Mszy
źródło
2
To nie działa dla mnie, jednak ustawienie ich truedziała, zgodnie z odpowiedzią Jacka T. Czy w ostatnich wersjach nastąpiła zmiana zachowania?
Protean
Oprócz mojej odpowiedzi musisz sprawdzić także inne właściwości, które masz w manifeście i pod kątem edycji tekstu.
King of Masses
Mam po prostu najbardziej podstawowe właściwości. Nie rozumiem jednak, dlaczego ustawianie ich na falsepowinno działać, ponieważ chodzi o to, aby odciągnąć uwagę od pól EditText.
Protean
Może kiedyś odciągał fokus od pól EditText, odsuwając go od układu nadrzędnego? Ale wydaje się, że już nie.
Protean
13

Spróbuj zadeklarować to w pliku menifest

<activity android:name=".HomeActivity"
      android:label="@string/app_name"
      android:windowSoftInputMode="stateAlwaysHidden"
      >
androidify
źródło
11

Jeśli używasz interfejsu API poziomu 21, możesz użyć editText.setShowSoftInputOnFocus (false);

SaraVF
źródło
9

Wystarczy dodać w AndroidManifest.xml

<activity android:name=".HomeActivity"  android:windowSoftInputMode="stateHidden">
</activity>
Dayanand Waghmare
źródło
8

Po prostu dodaj to do pliku manifest.xml

<activity android:name=".MainActivity"
            android:windowSoftInputMode="stateHidden">

Skończyliście.

Androido
źródło
7

Możesz także napisać te wiersze kodu w bezpośrednim układzie nadrzędnym pliku układu .xml, w którym występuje „problem”:

android:focusable="true"
android:focusableInTouchMode="true"

Na przykład:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    ...
    android:focusable="true"
    android:focusableInTouchMode="true" >

    <EditText
        android:id="@+id/myEditText"
        ...
        android:hint="@string/write_here" />

    <Button
        android:id="@+id/button_ok"
        ...
        android:text="@string/ok" />
</LinearLayout>


EDYTOWAĆ :

Przykład, jeśli EditText jest zawarty w innym układzie:

<?xml version="1.0" encoding="utf-8"?>
<ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    ... >                                            <!--not here-->

    ...    <!--other elements-->

    <LinearLayout
        android:id="@+id/theDirectParent"
        ...
        android:focusable="true"
        android:focusableInTouchMode="true" >        <!--here-->

        <EditText
            android:id="@+id/myEditText"
            ...
            android:hint="@string/write_here" />

        <Button
            android:id="@+id/button_ok"
            ...
            android:text="@string/ok" />
    </LinearLayout>

</ConstraintLayout>

Kluczem jest upewnienie się, że EditText nie można bezpośrednio ustawić na ostrość.
PA! ;-)

Jack T.
źródło
6

Najlepsze rozwiązanie dla mnie, wklej swoją klasę

@Override
public void onResume() {
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    super.onResume();
}

@Override
public void onStart() {
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    super.onStart();
}
Efe ÖZYER
źródło
3

Funkcja ukrywania klawiatury.

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();

    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

Ukryj klawiaturę w pliku AndroidManifext.xml.

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:windowSoftInputMode="stateHidden">
Philip BH
źródło
3

Aby rozwinąć zaakceptowaną odpowiedź @Lucas:

Nazwij to swoją aktywnością podczas jednego z wydarzeń na wczesnym etapie życia:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

Przykład Kotlina:

override fun onResume() {
  super.onResume()

  window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
}
Trevor.Screws
źródło
2

Możesz wypróbować ten zestaw unikatowych atrybutów dla każdego elementu

TextView mtextView = findViewById(R.id.myTextView);
mtextView.setShowSoftInputOnFocus(false);

Klawiatura nie wyświetla się, gdy element jest aktywny

Somwang Souksavatd
źródło
Chociaż może to odpowiedzieć na pytanie autora, brakuje w nim niektórych wyjaśnień i / lub linków do dokumentacji. Fragmenty surowego kodu nie są bardzo pomocne bez niektórych fraz wokół nich. Bardzo pomocne może się okazać, jak napisać dobrą odpowiedź . Edytuj swoją odpowiedź - Z recenzji
Nick
1
//to hide the soft keyboard
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
Julia Ashomok
źródło
0

po prostu dodaj to do swojej Aktywności:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
      if (getCurrentFocus() != null) {
           InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
           imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
      }
      return super.dispatchTouchEvent(ev);
}
Haythem Souissi
źródło