65 votes

EditText dans Listview perd le focus lorsqu'il est appuyé sur Android 4.x

Je sais qu'il y a beaucoup de questions similaires ici mais je n'ai réussi à faire fonctionner aucune des solutions fournies dans une application de test simple.

Le problème survient lorsque le clavier virtuel est affiché pour la première fois. Dès qu'il est affiché, il est seulement possible de le rendre éditable en appuyant à nouveau sur editText.

J'ai essayé ce qui suit:

 android:windowSoftInputMode="adjustPan|adjustResize"

Cela ne résout aucun problème. Il semble que cette ligne soit obligatoire pour redimensionner l'activité après l'affichage du clavier virtuel. Malheureusement, cela entraîne également la perte du focus pour tout EditText. Cela est probablement dû au fait que le ListView lui-même gagne le focus après le redimensionnement. J'ai donc essayé l'astuce suivante:

 listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

Cela fait toujours en sorte que le premier EditText visible contenu dans le ListView gagne le focus, ce qui est indésirable. Le deuxième EditText dans la deuxième rangée devrait plutôt gagner le focus lorsqu'il est pressé, ce qui n'arrive pas. De plus, si j'arrive finalement à mettre le focus sur un autre EditText que le premier affiché (par exemple en appuyant sur 'Suivant' sur le clavier virtuel), le premier affiché recevra le focus après que le clavier soit caché et que le ListView soit redimensionné à sa taille normale.

J'ai essayé plusieurs autres choses comme intercepter les événements onFocusChange() pour le ListView, tout en sachant quel EditText a été pressé grâce à son TouchListener. Demander à ce certain EditText de reprendre le focus n'a pas non plus donné de résultats.

Utiliser un ScrollView au lieu d'un ListView comme suggéré par d'autres utilisateurs n'est pas une option pour le projet concerné.

0 votes

Salut, je suppose que ce qui se passe ici n'est pas que le EditText doit être pressé une fois de plus, pour être opérationnel, mais le fait que le clavier virtuel apparaît, car il est déclenché par un champ, qui est éditable et prend le focus au départ. Vous pouvez essayer ceci public void hideSoftKeyboard(View v) { Activity activity = (Activity) v.getContext(); InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); }.

0 votes

Cela empêchera le clavier virtuel d'apparaître au début et je suppose que l'EditText devrait simplement être pressé pour déclencher la modification dedans.

0 votes

@g00dy, le problème n'est pas que le clavier apparaît initialement mais entrer du texte ne fonctionne pas correctement.

2voto

user1176776 Points 21

Utilisez Recycler View, cela résout plusieurs problèmes par rapport à la liste et au gridview. Vous pouvez même travailler avec des gridviews décalés. Vous pourriez facilement commencer à travailler avec ceci.

1voto

Kai Wang Points 1637

Lorsque la liste est suffisamment longue pour couvrir le clavier virtuel, le EditText dans Listview perd le focus lorsqu'on appuie dessus sur Android 4.x.

Une solution consiste à envelopper le Listview dans une disposition linéaire avec une hauteur de la moitié de l'écran.

Chaque fois que le Listview ne couvre pas le clavier virtuel, tout se passe bien.

1voto

Aman Agarwal Points 145

Rencontrait le même problème. J'ai cherché toutes ces solutions avec inputMode, focusability, et cetera. La meilleure solution est de migrer vers une vue recyclée.

0voto

user123456 Points 60

Dans mon cas, j'ai ajouté une valeur locale currentlyFocusedRow dans mon Adaptateur. Dans la méthode getView(), j'ai ajouté ce code à chaque editText :

   if (currentlyFocusedRow == position) {
        editText.requestFocus();
   }

        editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    if (currentlyFocusedRow == -1) {
                        currentlyFocusedRow = position;
                    }
                } else {
                    currentlyFocusedRow = -1;
                }
            }
        });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X