Android AutoCompleteTextView popup se déplaçant après l’affichage

Lorsque j’utilise la fonction autocompletetextview, tout fonctionne correctement, à l’exception qu’il bascule entre deux positions: la position correcte juste en dessous de la vue en mode texte et beaucoup plus basse. Il commence mal, mais se déplace presque immédiatement à la bonne position. Cependant, cela est très gênant lors de la frappe ou du backspacing, comme cela se produit pour chaque lettre. J’utilise Android Studio.

Il semble que deux événements tentent simultanément de décider de la mise en page. Parfois, il va restr dans une position ou l’autre.

** J’ai ralenti le processus de filtrage avec un adaptateur personnalisé et il semble que lorsque le texte est entré, il se place dans la mauvaise position, puis lorsque le filtrage est effectué, il revient à la bonne position.

Incorrect

Incorrect

Correct:

Correct

java (dans OnCreate ()) –

Ssortingng[] drugs = new Ssortingng[]{"Nexium","Amoxicillin","LEVOCETIRIZINE DIHYDROCHLORIDE", "Advil", "Advair Diskus", "Daraprim"}; AutoCompleteTextView drugNameAutoComplete = ((AutoCompleteTextView) findViewById(R.id.drugNameEditText)); drugNameAutoComplete.setAnimation(null); ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,drugs); drugNameAutoComplete.setAdapter(adapter); 

Et le code de mise en page

  

Si je supprime dropDownVeticalOffset, je passe entre la valeur correcte et celle-ci.

entrez la description de l'image ici

Pour changer cette position, utilisez l’atsortingbut dropDownAnchor et référencez un autre identifiant de vue. (voir sous autocomplete)

Android: dropDownAnchor

Afficher pour ancrer la liste déroulante de saisie semi-automatique. S’il n’est pas spécifié, la vue texte elle-même est utilisée.

et vous avez beaucoup d’atsortingbuts pour la liste déroulante ..

Vous feriez mieux d’utiliser l’outil Filter pour la saisie automatique, puis transmettez le texte saisi d’OnQueryTextListener à la saisie semi-automatique, puis définissez le texte sélectionné en appelant adapter.getitem.

Changer votre xml en-

  

Avez-vous utilisé le même identifiant sur l’autre AutoCompleteTextView? Je peux reproduire le comportement que vous décrivez en incluant deux vues avec le même identifiant.

J’ai eu le même problème de mon côté avec la dernière API pour une raison quelconque. J’ai résolu le problème en définissant explicitement dropDownAnchor , dropDownVerticalOffset et dropDownHeight dans les événements XML et onTextChanged.

Éditer: Après quelques vérifications, il semble que ce comportement soit INCONSISTANT ENTRE API commençant par Marshmallow (API 23). Essayez de changer votre code comme suit:

 final float scale = context.getResources().getDisplayMesortingcs().density; int verticalOffsetDP; int dropDownHeightDP = (int) (200 * scale + 0.5f); int currentApiVersion = android.os.Build.VERSION.SDK_INT; if (currentApiVersion < Build.VERSION_CODES.M) { // Prior to Marshmallow DropDownVerticalOffset works as expected verticalOffset = 0; } else { // Marshmallow has some weird DropDownVerticalOffset behavior so we have to compensate verticalOffset = (int) (50 * scale + 0.5f); } AutoCompleteTextView drugNameAutoComplete = ((AutoCompleteTextView)findViewById(R.id.drugNameEditText)); drugNameAutoComplete.setAnimation(null); ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,drugs); drugNameAutoComplete.setAdapter(adapter); drugNameAutoComplete.setDropDownAnchor(R.id.drugNameEditText); drugNameAutoComplete.setDropDownVerticalOffset(verticalOffsetDP); drugNameAutoComplete.setDropDownHeight(dropDownHeightDP); 

Et votre XML à ce qui suit:

  

Notez que vous devez calculer le DP en fonction des dimensions de l’écran dans le code. J’ai eu l’exemple de code de l’excellente réponse acceptée dans ce fil: Android et réglage de la largeur et de la hauteur par programme en unités dp

La raison pour laquelle vous devez également définir dropDownHeight est qu’autrement, Android a le comportement de le pousser en haut de l’écran si la liste dépasse les limites de hauteur de la vue, ce qui complique encore les problèmes de déplacement. Si cela ne vous dérange pas (certaines personnes ne le souhaitent pas, cela dépend de la configuration de votre vue), vous pouvez supprimer dropDownHeight de la programmation et de XML.

Je dois noter que ces modifications ne rendent toujours pas les choses EXACTEMENT identiques entre Marshmallow et les autres API. On dirait qu’il y a encore une différence de quelques pixels. Mais ça devient assez proche.

J’ai eu le même problème et trop d’heures plus tard, j’ai trouvé la solution.

Vous devriez changer:

android:layout_width="wrap_content" sur android:layout_width="match_parent"

J’espère que cela fonctionne pour vous aussi.