Affichage automatique du clavier à l'écran Android

140

Une de mes applications a un "écran d'ouverture" (essentiellement un menu) qui a un EditTextsuivi de plusieurs Buttons. Le problème est que plusieurs de mes utilisateurs signalent que lorsqu'ils ouvrent l'application, le clavier à l'écran apparaît automatiquement sans même qu'ils ne touchent le EditText. Pour autant que je sache, tous ces utilisateurs utilisent le HTC Hero .

Est-ce un bogue dans la version 1.5? Est-ce que je peux faire quelque chose à ce sujet?

Jeremy Logan
la source
1
Si c'est un bug, c'est probablement dans le Sprint Hero en particulier. Sprint a une version boguée d'Android sur les héros qu'ils vendent et ils ne semblent pas pressés de proposer des corrections de bogues. Il existe des tonnes de différences de comportement entre les Sprint Heros et tous les autres appareils Android. Autant que je sache, les autres versions du Hero, comme celles d'Europe, n'ont pas ces problèmes.
Mark B
Malheureusement, les héros ici en Europe ont des problèmes majeurs, ils changent en fonction du numéro de build, mais nous avons rencontré 3 à 4 bugs majeurs.
Donal Rafferty

Réponses:

279

Vous pouvez utiliser la ligne de code suivante dans la méthode onCreate de l'activité pour vous assurer que le clavier n'apparaît que lorsqu'un utilisateur clique dans un EditText

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
Donal Rafferty
la source
Cela ne fonctionne pas pour moi (2.2 MyTouch 3G). Dans ma méthode onCreate (), j'appelle setSoftInputMode (). Le EditText fait toujours afficher le clavier :(
Nate
Cela a fonctionné pour moi. J'utilise Android 2.3.4 et je développe avec <uses-sdk android: minSdkVersion = "3" />
Sandy
78
Ou utilisez android:windowSoftInputMode="stateHidden"comme ici
Swato
Donc, ce qui me trouble, c'est que j'ai une activité de connexion qui semble déjà masquer le clavier très bien. J'ai aussi fait une activité de registre maintenant mais le clavier apparaît par défaut. Alors, comment la connexion évite-t-elle cela? Je ne trouve pas le setSoftInputMode dans l'activité de connexion ou l'attribut windowSoftInputMode dans le activity.xml.
Chucky
ne fonctionne pas toujours: sur certains appareils, SOFT_INPUT_STATE_ALWAYS_HIDDEN provoque l'erreur qu'un texte d'édition qui n'est pas le dernier de l'activité ne peut pas faire apparaître le clavier logiciel. l'utilisation de "android: windowSoftInputMode =" stateHidden "" dans le manifeste a également le même effet. la documentation du développeur déclare que le clavier virtuel n'apparaîtra pas automatiquement à moins d'y être forcé, mais c'est tout simplement faux.
85
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Main"
              android:label="@string/app_name"
              android:windowSoftInputMode="stateHidden"
              >

Cela fonctionne pour Android 3.0, 3.1, 3.2, 4.0 - Éditeur utilisé pour compiler (Eclipse 3.7)

Placez le 'windowSoftInputMode = "stateHidden"' dans le fichier XML manifeste de votre application pour CHAQUE activité dans laquelle vous souhaitez que le clavier logiciel reste caché. Cela signifie que le clavier ne s'affichera pas automatiquement et que l'utilisateur devra "cliquer" sur un champ de texte pour le faire apparaître. J'ai cherché pendant près d'une heure quelque chose qui fonctionnait, alors j'ai pensé partager.

deuilgrym1969
la source
La meilleure solution que j'ai trouvée jusqu'à présent. Concentre le champ sans ouvrir le clavier. Fonctionne sur Nexus S avec 4.1.2
alexismorin
1
android: windowSoftInputMode = "stateHidden | AdjustNothing" est également utile si vous utilisez des fragments et que vous ne voulez pas que le clavier change la disposition
whyoz
6

Ajoutez ceci dans votre AndroidManifest.xml :

android:windowSoftInputMode="stateHidden|adjustResize"

Cela fonctionne parfaitement. :)

Arun
la source
1
Merci pour la réponse. Je suis désolé, comment puis-je appeler le clavier maintenant? Il n'apparaîtra pas lors de l'appel requestFocus().
Takesi Tokugawa YD
6

Ce code fonctionnera sur toutes les versions d'Android:

@Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_login);

 //Automatic popping up keyboard on start Activity

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

 or

 //avoid automatically appear android keyboard when activity start
     getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
 }
Satheeshkumar Somu
la source
Plus 1 pour savoir ce qui apparaît et ce qui ne le fait pas
Demon App Programmer
4

Ajoutez ceci dans la mise en page parent du XML.

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

Cela garantit que le focus n'est pas sur editText lorsque l'activité démarre.

Ben
la source
3

Vous pouvez utiliser ceci dans la méthode onCreate () de l'activité

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

ou collez ce code dans les balises d'activité dans AndroidManifest.xml

android:windowSoftInputMode="stateVisible"
sommer
la source
2
Je pense que vous voulez dire "stateHidden" plutôt que "stateVisible".
stevehs17
2

Vous pouvez ajouter la seule ligne de code dans Android Mainfest.xml sous la balise d'activité

 <activity
        android:name="com.sams.MainActivity"
        android:windowSoftInputMode="stateVisible" >
 </activity>

cela peut vous aider.

Mohanraj SK
la source
1

Dans cette version d'Android, lorsqu'une vue est gonflée, le focus sera défini sur le premier contrôle focusable par défaut - et s'il n'y a pas de clavier physique, le clavier à l'écran apparaîtra.

Pour résoudre ce problème, définissez explicitement le focus ailleurs. Si le focus est défini sur autre chose qu'un EditText, le clavier à l'écran n'apparaîtra pas.

Avez-vous essayé de tester cela en exécutant Android 1.5 dans l'émulateur?

dmazzoni
la source
Je l'ai essayé dans l'émulateur (et je l'ai fait à nouveau pour m'assurer que je n'étais pas fou). Il agit "à droite" (ce qui signifie pas de pop-up de clavier). De plus, quand j'ai écrit ceci, mon G1 fonctionnait en version 1.5 et il n'a pas agi de cette façon (quand le clavier était "caché").
Jeremy Logan
Je parie toujours que cela a quelque chose à voir avec l'objectif initial. C'est peut-être quelque chose de spécifique au HTC Hero, mais j'essaierais de mettre explicitement l'accent sur autre chose et voir si cela le résout pour vos utilisateurs.
Mark B
Existe-t-il un moyen de se concentrer sur «rien»?
Jeremy Logan
1
Cela ne fonctionne pas pour moi (2.2 MyTouch 3G). Dans ma méthode onCreate (), j'appelle explicitement requestFocus () sur un Button, qui est le deuxième widget de la vue. Le EditText fait toujours afficher le clavier :(
Nate
1

Vous pouvez le faire par programme comme

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editTextField.getWindowToken(), 0);

ou mis android:windowSoftInputMode="stateHidden"à l' <activity tagintérieurAndroidManifest.xml

Xar-e-ahmer Khan
la source
1

Incluez ceci là où les importations sont en haut:

import android.view.WindowManager;

Ajoutez ce code sur la partie OnCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ....
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
}
Mike Zriel
la source
0
InputMethodManager imm = (InputMethodManager)GetSystemService(Context.InputMethodService);
        imm.ShowSoftInput(_enterPin.FindFocus(), 0);

* Ceci est pour Android.xamarin et FindFocus () - il recherche la vue dans la hiérarchie enracinée dans cette vue qui a actuellement le focus, comme j'ai _enterPin.RequestFocus () avant le code ci-dessus, il affiche donc le clavier pour _enterPin EditText *

Ruchira
la source