web-dev-qa-db-fra.com

EditText perd le focus lorsque le clavier apparaît; nécessite de toucher deux fois pour modifier

J'ai conçu une application qui contient une liste extensible. À la fin de chaque liste, un EditTextvide est prêt à recevoir des commentaires. J'ai le problème suivant lorsque je touche le EditTextname__, 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 EditTextdans la liste) et le clavier virtuel apparaît. Cependant, lors de ces événements, le EditTextperd 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 EditTextname__. Une fois que je le touche à nouveau, le EditTextse comporte comme prévu.

Cela devient encore plus étrange. Avec le clavier toujours affiché, je peux toucher un autre EditTextet 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 EditTextname__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 EditTextname__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 à Activitypour 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 EditTextpeuvent ê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!

24
Eric

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

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);
        }
    }
});
5
Tonic Artos

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.

2
Houston

Vous pouvez essayer quelque chose comme:

editText.requestFocus();

Vous pouvez également définir ceci:

Android:windowSoftInputMode="stateHidden"

dans votre fichier manifeste

1
lokoko

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

1
saravanan

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