Duplicata possible :
Comment fermer/masquer le clavier programmable Android de manière programmatique ?
Tout d'abord, j'ai déjà vu este fil. J'ai essayé les méthodes acceptées qui y sont données, mais rien n'a fonctionné pour moi.
J'ai deux écrans dans mon application.
- Le premier a 2 EditText - Un pour le nom d'utilisateur et un pour le mot de passe.
- La seconde a une ListView, et un EditText - pour filtrer les données. listView
Dans mon premier écran, je veux que le nom d'utilisateur EditText ait le focus au démarrage et que le clavier soit visible. . Voici mon implémentation (simplifiée en supprimant le code inutile ou sans rapport).
app_login.xml
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dip"
android:paddingRight="20dip">
<EditText android:id="@+id/username"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:hint="Username"
android:imeOptions="actionDone" android:inputType="text"
android:maxLines="1"/>
<EditText android:id="@+id/password"
android:password="true"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Password" />
</LinearLayout>
AppLogin.java
class AppLogin extends Activity{
private EditText mUserNameEdit = null;
private EditText mPasswordEdit = null;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.app_login);
mUserNameEdit = (EditText) findViewById(R.id.username);
mPasswordEdit = (EditText) findViewById(R.id.password);
/* code to show keyboard on startup.this code is not working.*/
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT);
}//End of onCreate()
}
Bien, le clavier ne s'affiche pas au démarrage . Et mon projet nécessite un clavier à cet endroit.
Passons maintenant à deuxième page . Comme je l'ai déjà mentionné, j'y ai une listView et un EditText. Je veux que mon clavier soit masqué au démarrage et qu'il apparaisse lorsque l'utilisateur touche le texte à modifier. . Pouvez-vous le croire ? Quoi que j'ai essayé Le clavier souple s'affiche lorsque je charge l'activité. . Je ne suis pas capable de le cacher.
app_list_view.xml
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText android:id="@+id/filter_edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Search" android:inputType="text"
android:maxLines="1"/>
<ListView android:id="@id/android:list"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:layout_width="fill_parent"
android:focusable="true"
android:descendantFocusability="beforeDescendants"/>
</LinearLayout>
AppList.java
public class MyListActivity extends ListActivity{
private EditText mfilterEditText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_list_view);
mFilterEditText = (EditText) findViewById(R.id.filter_edittext);
InputMethodManager imm = InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mFilterEditText.getWindowToken(), 0);
}
}
Pour simplifier
- Sur la page de connexion (première page), je veux que mon clavier soit visible au démarrage.
- Sur la deuxième page, je veux que le clavier soit d'abord caché, puis qu'il apparaisse. lorsque l'utilisateur touche editText
Et mon problème est que j'obtiens l'exact opposé dans les deux cas. . J'espère que quelqu'un a déjà rencontré ce problème. BTW Je teste sur le simulateur et le téléphone HTC Desire.
RÉSULTAT FINAL
Eh bien, je l'ai fait fonctionner, avec l'aide de tous mes amis ici.
1. Pour afficher le clavier au démarrage
Deux réponses ont fonctionné pour moi. Celle fournie par @CapDroid, qui consiste à utiliser un gestionnaire et à le poster en différé
mUserNameEdit.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
InputMethodManager keyboard = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(mUserNameEdit, 0);
}
},50);
La deuxième réponse est fournie par @Dyarish. En fait, il a fait un lien vers un autre fil de discussion sur les FOS, que je n'avais pas vu auparavant. Mais le plus drôle, c'est que cette solution est donnée dans le fil que j'ai référencé au début. Et je n'ai pas essayé Et je ne l'ai pas essayée parce qu'elle n'avait pas de votes dans un fil où tous les autres messages ont beaucoup de votes. Le comble de la bêtise.
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
En ce qui me concerne, la deuxième solution m'a semblé correcte et j'ai décidé de m'y tenir, mais la première fonctionne certainement. De plus, la réponse de @Dyarish contient une astuce astucieuse consistant à utiliser un ScrollView sous EditText pour donner le focus à EditText. Je ne l'ai pas essayé, mais cela devrait fonctionner. Mais ce n'est pas très élégant.
2. Pour masquer le clavier au début de l'activité
Une seule réponse a fonctionné pour moi, celle fournie par @Dyarish. La solution est d'utiliser les paramètres focusableInTouchMode dans le XML pour la disposition contenant les EditTexts. Voici ce qui a fonctionné
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:focusableInTouchMode="true">
<EditText android:id="@+id/filter_edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Search" android:inputType="text"
android:maxLines="1"/>
<ListView android:id="@id/android:list"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:layout_width="fill_parent"
android:focusable="true"
android:descendantFocusability="beforeDescendants"/>
</LinearLayout>
Quoi qu'il en soit, je finis par utiliser la réponse de Dyarish dans les deux cas. C'est donc à lui que j'attribue la prime. Merci à tous mes autres amis qui ont essayé de m'aider.
0 votes
@user7777777777 J'ai modifié ma question...mais cela ne fonctionne pas...J'ai essayé avec différents drapeaux au lieu de 0 aussi...
1 votes
Voir mon nouvelle version répondre, ça marche pour moi...
0 votes
La mise en page app_login.xml ne semble pas être le fichier de mise en page complet. Veuillez afficher la mise en page complète.
1 votes
La mise en page app_login.xml ne semble pas être le fichier de mise en page complet. Est-ce que ça compte ?
1 votes
Merci ! Content que ça ait marché pour toi. =D
0 votes
@krishnabhadra : ça marche ! mais je ne comprends pas la raison : qu'est-ce que focusableintouchmode="true" implique ?
0 votes
Possible votre réponse : stackoverflow.com/a/1109108/779408
0 votes
PostDelayed fonctionne parfaitement avec moi
0 votes
Il peut être facilement affiché et masqué avec des méthodes pratiques, mais il n'y a pas de moyen implémenté d'attraper quand l'utilisateur choisit de le masquer. En raison de ces limitations, j'ai codé un simple snippet qui, je l'espère, sera utile. Il est disponible ici . Il est assez facile à utiliser.
0 votes
Il faut jouer avec InputMethodManager avec le INPUT_METHOD_SERVICE pour gérer le clavier souple, par exemple readyandroid.wordpress.com/show-hide-Android-soft-keyboard