J'ai conçu une application qui contient une liste extensible. À la fin de chaque liste, un EditText
vide est prêt à recevoir des commentaires. J'ai le problème suivant lorsque je touche le EditText
name__, l'écran se redimensionne légèrement (ce qui ne pose pas de problème car le redimensionnement n'a pas toujours lieu, cela dépend de ma présentation et de la position de la EditText
dans la liste) et le clavier virtuel apparaît. Cependant, lors de ces événements, le EditText
perd le focus et ne le regagne pas. Ceci est assez gênant car sans focus, bien que le clavier soit disponible, la saisie depuis le clavier n’atteint pas le EditText
name__. Une fois que je le touche à nouveau, le EditText
se comporte comme prévu.
Cela devient encore plus étrange. Avec le clavier toujours affiché, je peux toucher un autre EditText
et il en va de même. il perd le focus. Cependant, une fois ma perte de concentration initiale passée, je peux passer librement de EditText
name__s précédemment touché sans aucun problème lié à la mise au point. L '"état" ne disparaît que lorsque je masque le clavier logiciel et je devrais appuyer deux fois sur EditText
name__s avant de pouvoir les modifier.
Voici des extraits de mon code. Tout d'abord, le empty_comment.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical" >
<EditText
Android:id="@+id/blank_box"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:inputType="textCapSentences"
Android:imeOptions="actionDone"
Android:hint="@string/hint"
Android:layout_marginLeft="30dip" >
</EditText>
</LinearLayout>
Voici un extrait du fragment où j'utilise la mise en page en question:
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.comment_empty, null);
final EditText editText = (EditText) convertView.findViewById(R.id.blank_box);
editText.setOnEditorActionListener(new OnEditorActionListener()
{
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
{
if(actionId == EditorInfo.IME_ACTION_DONE)
{
// Unrelated code
}
return true;
}
});
Je ne spécifie aucun élément spécifique dans mon fichier manifeste, mais je peux le fournir si cela est jugé utile.
Mettre à jour:
L'ajout d'une ligne à Activity
pour ajuster le panoramique Android:windowSoftInputMode="adjustPan"
résout partiellement le problème. Il remplace le comportement inattendu actuel par le problème suivant: les vues EditText
peuvent être masquées par le clavier virtuel.
Pour l'instant, aucune solution idéale n'a été trouvée mais abordée. Regardez les commentaires dans la réponse acceptée, ils pourraient vous être utiles!
Vous devez changer votre AndroidManifest.xml
Ajoutez Android:windowSoftInputMode="adjustPan"
à l'activité contenant la liste. Cela résoudra votre problème.
<activity Android:name=".MyEditTextInListView"
Android:label="@string/app_name"
Android:windowSoftInputMode="adjustPan">
Une solution consiste à publier un exécutable différé qui vérifie si la vue EditText est toujours active et, dans le cas contraire, concentrez-vous dessus.
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(final View v, boolean hasFocus) {
if (hasFocus) {
// Request focus in a short time because the
// keyboard may steal it away.
v.postDelayed(new Runnable() {
@Override
public void run() {
if (!v.hasFocus()) {
v.requestFocus();
}
}
}, 200);
}
}
});
J'ai eu le même problème ... Je l'ai résolu en prolongeant EditText.
J'ai créé un onClickListener et dans cette méthode, j'ai le code suivant:
public OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
EditTextInput.this.setFocusable(true);
EditTextInput.this.setFocusableInTouchMode(true);
EditTextInput.this.requestFocus();
}
};
J'ai ensuite placé le code suivant dans le rappel onKeyPreIme. Vous devrez étendre EditText pour y accéder.
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK & event.getAction() == KeyEvent.ACTION_UP) {
EditTextInput.clearFocus();
EditTextInput.this.setFocusable(false);
EditTextInput.this.setFocusableInTouchMode(false);
return false;
}
return super.dispatchKeyEvent(event);
}
Je trouve que je dois activer/désactiver le drapeau de mise au point afin d’amener le clavier au premier clic. J'espère que cela aide ... fonctionne pour moi.
Vous pouvez essayer quelque chose comme:
editText.requestFocus();
Vous pouvez également définir ceci:
Android:windowSoftInputMode="stateHidden"
dans votre fichier manifeste
vous pouvez essayer ce code ci-dessous pour Android manifest.xml
ajouter le code au manifeste Android Android: windowSoftInputMode = "adjustPan"
Et aussi ajouter à la mise en page XML
<EditText
Android:background="#FFFFFF"
Android:capitalize="sentences"
Android:inputType="textVisiblePassword"
Android:layout_height="35px"
>
<requestFocus />
J'ai eu ce problème avec Android.support.design.widget.TextInputEditText
et il a été résolu en changeant l'ordre du drapeau dans manifest:
Android:windowSoftInputMode="stateHidden|adjustPan"
à
Android:windowSoftInputMode="adjustPan|stateHidden"