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?


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.


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é.


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

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 :)


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

11

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


9

Il suffit d'ajouter dans AndroidManifest.xml

<activity android:name=".HomeActivity"  android:windowSoftInputMode="stateHidden">
</activity>

8

Ajoutez simplement ceci dans votre fichier manifest.xml

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

Vous avez tous terminé.


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


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

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

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

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


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

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);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.