J'ai passé environ 6 heures là-dessus jusqu'à présent et je n'ai rencontré que des barrages routiers. Le principe général est qu'il y a une ligne dans un ListView
(qu'elle soit générée par l'adaptateur ou ajoutée en tant que vue d'en-tête) qui contient un EditText
widget et un fichier Button
. Tout ce que je veux faire, c'est pouvoir utiliser le jogball / les flèches, pour naviguer dans le sélecteur vers des éléments individuels comme d'habitude, mais quand j'arrive à une ligne particulière - même si je dois identifier explicitement la ligne - qui a un focusable enfant, je veux que cet enfant se concentre au lieu d'indiquer la position avec le sélecteur.
J'ai essayé de nombreuses possibilités et jusqu'à présent, je n'ai pas eu de chance.
disposition:
<ListView
android:id="@android:id/list"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
/>
Vue d'en-tête:
EditText view = new EditText(this);
listView.addHeaderView(view, null, true);
En supposant qu'il existe d'autres éléments dans l'adaptateur, l'utilisation des touches fléchées déplacera la sélection vers le haut / bas dans la liste, comme prévu; mais en arrivant à la ligne d'en-tête, il est également affiché avec le sélecteur, et aucun moyen de se concentrer sur l' EditText
utilisation du jogball. Remarque: en tapant sur le EditText
sera le concentrer à ce moment - là, mais qui repose sur un écran tactile, ce qui ne devrait pas être une exigence.
ListView
a apparemment deux modes à cet égard:
1 setItemsCanFocus(true)
.: le sélecteur n'est jamais affiché, mais le EditText
peut obtenir le focus en utilisant les flèches. L'algorithme de recherche de focus est difficile à prédire et aucun retour visuel (sur les lignes: avoir des enfants focalisables ou non) sur quel élément est sélectionné, les deux pouvant donner à l'utilisateur une expérience inattendue.
2 setItemsCanFocus(false)
.: le sélecteur est toujours dessiné en mode non tactile et EditText
ne peut jamais obtenir la mise au point, même si vous appuyez dessus.
Pour aggraver les choses, l'appel editTextView.requestFocus()
renvoie true, mais en fait ne donne pas le focus EditText.
Ce que j'envisage est fondamentalement un hybride de 1 et 2, où plutôt que le paramètre de liste si tous les éléments sont focalisables ou non, je souhaite définir la focalisation pour un seul élément de la liste, de sorte que le sélecteur passe de manière transparente à la sélection du ligne entière pour les éléments non focalisables et traversant l'arborescence du focus pour les éléments contenant des enfants focalisables
N'importe quels preneurs?
descendantFocusability="afterDescendants"
permettra à votre EditText de prendre le focus à l'intérieur de ListView, mais vous n'obtiendrez alors aucun sélecteur d'élément de liste lorsque vous naviguez avec un dpad. Ma tâche était d'avoir le sélecteur d'élément de liste sur toutes les lignes sauf celle avec le EditText. Heureux que cela ait aidé. FWIW, nous avons fini par réévaluer cette implémentation et avons décidé qu'un focusable dans un ListView n'était tout simplement pas une conception d'interface utilisateur idiomatique pour Android, nous avons donc abandonné l'idée en faveur d'une approche plus conviviale pour Android.Cela m'a aidé.
Dans votre manifeste:
la source
OnItemSelectedListener
ne change pas cela. Cependant, la solution simple d'Iogan fonctionne comme un charme, merci!android:descendantFocusability
propriété de Joe, j'ai réussiEditText
àListView
résoudre correctement le clavier, à voter pour les deux.android:descendantFocusability
en lui-même n'a pas fait l'affaire et je n'étais pas très enthousiasmé@Overriding
onItemSelected
par les 14EditText
secondes auxquelles je dois faire face. :) Merci!Ma tâche était de mettre en œuvre
ListView
ce qui se développe lorsqu'on clique dessus. L'espace supplémentaire montreEditText
où vous pouvez saisir du texte. L'application doit être fonctionnelle sur 2.2+ (jusqu'à 4.2.2 au moment de la rédaction de cet article)J'ai essayé de nombreuses solutions à partir de ce post et d'autres que j'ai pu trouver; les a testés sur des appareils 2.2 à 4.2.2. Aucune des solutions n'était satisfaisante sur tous les appareils 2.2+, chaque solution présentant des problèmes différents.
Je voulais partager ma solution finale:
android:descendantFocusability="afterDescendants"
setItemsCanFocus(true);
android:windowSoftInputMode="adjustResize"
Beaucoup de gens suggèrentadjustPan
maisadjustResize
donne une bien meilleure ux à mon humble avis, testez simplement cela dans votre cas. Avec,adjustPan
vous obtiendrez les éléments de la liste du bas obscurcis par exemple. Les documents suggèrent que ("Ceci est généralement moins souhaitable que le redimensionnement"). Aussi sur 4.0.4 après que l'utilisateur commence à taper sur le clavier logiciel, l'écran se déplace vers le haut.adjustResize
il y a quelques problèmes avec le focus EditText. La solution consiste à appliquer la solution rjrjr à partir de ce thread. Cela a l'air effrayant mais ce n'est pas le cas. Et il fonctionne. Essayez-le.Supplémentaire 5. En raison de la mise à jour de l'adaptateur (à cause du redimensionnement de la vue) lorsque les
EditText
gains se concentrent sur les versions antérieures à HoneyComb, j'ai trouvé un problème avec les vues inversées: obtenir la vue pour l'élément ListView / ordre inverse sur 2.2; fonctionne sur 4.0.3Si vous faites des animations, vous voudrez peut-être changer le comportement
adjustPan
des versions pré-nid d'abeille afin que le redimensionnement ne se déclenche pas et que l'adaptateur n'actualise pas les vues. Vous avez juste besoin d'ajouter quelque chose comme çaTout cela donne une ux acceptable sur les appareils 2.2 - 4.2.2. J'espère que cela fera gagner du temps aux gens car il m'a fallu au moins plusieurs heures pour arriver à cette conclusion.
la source
Cela m'a sauvé la vie --->
définir cette ligne
ListView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
Ensuite, dans votre manifeste dans la balise d'activité, tapez ceci ->
<activity android:windowSoftInputMode="adjustPan">
Votre intention habituelle
la source
Nous essayons cela sur une courte liste qui ne fait aucun recyclage de vue. Jusqu'ici tout va bien.
XML:
Java:
la source
ce message correspondait exactement à mes mots clés. J'ai un en-tête ListView avec un EditText de recherche et un bouton de recherche.
Afin de donner le focus à EditText après avoir perdu le focus initial, le seul HACK que j'ai trouvé est:
J'ai perdu beaucoup d'heures et ce n'est pas une vraie solution. J'espère que cela aide quelqu'un de dur.
la source
Si la liste est dynamique et contient des widgets focalisables, la bonne option consiste à utiliser RecyclerView au lieu de ListView IMO.
Les solutions de contournement ensemble
adjustPan
,FOCUS_AFTER_DESCENDANTS
ou manuellement position mise au point se souviennent, sont en effet des solutions de contournement juste. Ils ont des cas d'angle (problèmes de défilement + clavier logiciel, changement de position du curseur dans EditText). Ils ne changent pas le fait que ListView crée / détruit des vues en masse pendantnotifyDataSetChanged
.Avec RecyclerView, vous notifiez les insertions, les mises à jour et les suppressions individuelles. La vue focalisée n'est pas recréée donc aucun problème avec les contrôles de formulaire perdant le focus. En prime, RecyclerView anime les insertions et suppressions d'éléments de liste.
Voici un exemple tiré de la documentation officielle sur la façon de démarrer avec
RecyclerView
: Guide du développeur - Créer une liste avec RecyclerViewla source
Parfois, lorsque vous utilisez
android:windowSoftInputMode="stateAlwaysHidden"
dans l'activité manifeste ou xml, cette fois, il perdra le focus clavier. Vérifiez donc d'abord cette propriété dans votre xml et votre manifeste, si elle existe, supprimez-la. Après avoir ajouté ces options au fichier manifeste dans l'activité secondaireandroid:windowSoftInputMode="adjustPan"
et ajoutez cette propriété à la vue de liste en xmlandroid:descendantFocusability="beforeDescendants"
la source
Une autre solution simple consiste à définir votre onClickListener, dans la méthode getView (..), de votre ListAdapter.
De cette façon, votre ligne est cliquable, et votre vue intérieure aussi :)
la source
La partie la plus importante est de faire fonctionner le focus pour la cellule de liste. Surtout pour la liste sur Google TV, c'est essentiel:
La méthode setItemsCanFocus de la vue liste fait l'affaire:
Ma cellule de liste xml commence comme suit:
nextFocusLeft / Right sont également importants pour la navigation D-Pad.
Pour plus de détails, consultez les excellentes autres réponses.
la source
Je viens de trouver une autre solution. Je crois que c'est plus un hack qu'une solution mais cela fonctionne sur Android 2.3.7 et Android 4.3 (j'ai même testé ce bon vieux D-pad)
lancez votre webview comme d'habitude et ajoutez ceci: (merci Michael Bierman)
Pendant l'appel getView:
la source
Essayez ça
dans le
section de votre manifeste. Oui, cela n'ajuste rien, ce qui signifie que le editText restera où il se trouve lors de l'ouverture de l'IME. Mais ce n'est qu'un petit inconvénient qui résout encore complètement le problème de la perte de concentration.
la source