Empêcher le clavier de s'afficher au début de l'activité

265

J'ai une activité avec une Edit Textentrée. Lorsque l'activité est initialisée, le clavier Android s'affiche. Comment le clavier peut-il rester caché jusqu'à ce que l'utilisateur concentre l'entrée?

Fcoder
la source
93
dans votre manifeste<activity android:windowSoftInputMode="stateHidden" ...>
idiottiger
1
Comment utiliser avec android:windowSoftInputMode="adjustPan"?
János
4
@ János android: windowSoftInputMode = "adjustPan | stateHidden"
Alexey Strakh
la réponse dans ce commentaire, était la réponse que je recherche: stackoverflow.com/a/23605510/6942602
korchix

Réponses:

436

Je pense que ce qui suit peut fonctionner

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

Je l'ai déjà utilisé pour ce genre de choses.

Lucas
la source
Existe-t-il un moyen de le définir comme un clavier à chiffres uniquement? ie clavier 12 touches?
Mohamed Khamis
@MohamedKhamis input.setRawInputType (Configuration.KEYBOARD_12KEY);
blockwala
1
Oui ça marche toujours. @SagarNayak pourquoi voudriez-vous cacher le clavier pour EditText? :) C'est pour cacher le clavier lorsque l'activité commence qui contientEditText
Martynas
@Devealte 7 ans plus tard et cela a fonctionné pour moi, l'avez-vous placé dans onCreate?
Dymas
@Dymas Oui, et je viens de le corriger il y a plusieurs mois :)
Devealte
180

Essayez aussi -

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

Sinon, déclarez dans l'activité de votre fichier manifeste -

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

Si vous avez déjà utilisé android:windowSoftInputModeune valeur comme adjustResizeou adjustPan, vous pouvez combiner deux valeurs comme:

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

Cela masquera le clavier chaque fois que cela sera approprié, mais effectuera un panoramique dans la vue d'activité au cas où le clavier doit être affiché.

Praveenkumar
la source
3
merci de montrer à la fois en code et en xml! En effet, c'est la réponse la plus correcte! D'autant plus que c'est probablement 3 minutes que vous avez passé à écrire les deux méthodes qui ne vous ont pas fait commencer ;-)
eric
34

Cachez-le pour toutes les activités utilisant le thème

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

définir le thème

<application android:theme="@style/MyTheme">
dira
la source
comme cette approche globale.
Rm558
1
Cela a fonctionné car
j'utilisais
22

Ajoutez ces deux propriétés à votre disposition parent (ex: disposition linéaire, disposition relative)

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

Ça fera l'affaire :)

Roi des masses
la source
2
Cela ne fonctionne pas pour moi, mais les faire truefonctionner, selon la réponse de Jack T. Y a-t-il eu un changement de comportement dans les versions récentes?
Protean
En plus de ma réponse, vous devez également vérifier les autres propriétés que vous avez dans le manifeste et pour modifier le texte.
King of Masses
J'ai juste les propriétés les plus élémentaires en eux. Je ne comprends pas pourquoi leur définition falsedevrait fonctionner, car l'idée est de détourner l'attention des zones EditText.
2018 Protean
Peut-être que cela détournait le focus des zones EditText en l'éloignant de la disposition parent? Mais plus maintenant, semble-t-il.
Protean
13

Essayez de le déclarer dans le fichier menifest

<activity android:name=".HomeActivity"
      android:label="@string/app_name"
      android:windowSoftInputMode="stateAlwaysHidden"
      >
androidify
la source
11

Si vous utilisez le niveau 21 de l'API, vous pouvez utiliser editText.setShowSoftInputOnFocus (false);

SaraVF
la source
9

Il suffit d'ajouter dans AndroidManifest.xml

<activity android:name=".HomeActivity"  android:windowSoftInputMode="stateHidden">
</activity>
Dayanand Waghmare
la source
8

Ajoutez simplement ceci dans votre fichier manifest.xml

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

Vous avez tous terminé.

Androido
la source
7

Vous pouvez également écrire ces lignes de code dans la disposition parent directe du fichier de disposition .xml dans lequel vous avez le "problème":

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

Par exemple:

<?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>


ÉDITER :

Exemple si le EditText est contenu dans une autre mise en page:

<?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>

La clé est de s'assurer que le EditText n'est pas directement focalisable.
Au revoir! ;-)

Jack T
la source
6

Meilleure solution pour moi, collez votre classe

@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
la source
3

Fonction pour masquer le clavier.

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);
    }
}

Masquer le clavier dans le fichier AndroidManifext.xml.

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:windowSoftInputMode="stateHidden">
Philip BH
la source
3

Pour développer la réponse acceptée par @Lucas:

Appelez cela depuis votre activité dans l'un des premiers événements du cycle de vie:

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

Exemple de Kotlin:

override fun onResume() {
  super.onResume()

  window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
}
Trevor.Screws
la source
2

Vous pouvez essayer cet attribut unique défini pour chaque élément

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

Le clavier ne s'affichera pas lorsque l'élément est mis au point

Somwang Souksavatd
la source
Bien que cela puisse répondre à la question des auteurs, il manque des mots explicatifs et / ou des liens vers la documentation. Les extraits de code brut ne sont pas très utiles sans quelques phrases autour d'eux. Vous pouvez également trouver comment rédiger une bonne réponse très utile. Veuillez modifier votre réponse - De l'avis
Nick
1
//to hide the soft keyboard
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
Yuliia Ashomok
la source
0

ajoutez simplement ceci sur votre Activité:

@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
la source