Всплывающее окно Android AutoCompleteTextView, перемещающееся после отображения

Когда я использую autocompletetextview, все работает отлично, за исключением того, что он держит переключение между двумя позициями: правильное прямо под текстовым изображением и довольно низкими способами. Он начинает ошибаться, но почти сразу переходит в правильное положение. Однако это очень раздражает при наборе текста или в обратном порядке, как это происходит для каждой буквы. Я использую андроид-студию.

Кажется, что два события одновременно пытаются решить макет. Иногда он будет придерживаться в одном или другом положении.

** Я замедлял процесс фильтрации с помощью пользовательского адаптера, и, похоже, при вводе текста он перемещается в неправильное положение, а затем, когда фильтрация выполняется, он возвращается в правильное положение.

некорректный

некорректный

Верный:

Верный

Java (в OnCreate ()) –

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

И код макета –

 <AutoCompleteTextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/drugNameEditText" android:enabled="true" android:singleLine="true" android:layout_below="@+id/lookingForView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:dropDownVerticalOffset="50dp" android:hint="@string/drug_name" /> 

Если я удалю dropDownVeticOffset, я получаю мерцание между правильным значением и этим –

Введите описание изображения здесь

Solutions Collecting From Web of "Всплывающее окно Android AutoCompleteTextView, перемещающееся после отображения"

Чтобы изменить эту позицию, используйте атрибут dropDownAnchor и укажите другой идентификатор вида. (Просмотр под автозаполнением)

андроид: dropDownAnchor

Просмотр, чтобы привязать раскрывающийся список автозаполнения. Если не указано, используется текстовое представление.

И у вас есть много атрибутов для выпадающего списка.

Вам лучше использовать утилиту Filter to autocomplete adapter и передать введенный текст из OnQueryTextListener из автозаполнения и установить выделенный текст, вызвав файл adapter.getitem.

Измените свой xml-to-

 <AutoCompleteTextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/drugNameEditText" android:enabled="true" android:singleLine="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" **android:dropDownVerticalOffset="0dp"** **android:dropDownAnchor="@id/drugNameEditText"** android:hint="drug" /> 

Вы случайно использовали один и тот же идентификатор на другом автокомплектеTextView? Я могу воспроизвести описанное вами поведение, включив два представления с одним и тем же идентификатором.

По какой-то причине у меня была такая же проблема с моей стороны с новейшим API. Я решил проблему, явно устанавливая dropDownAnchor , dropDownVerticalOffset и dropDownHeight как в XML, так и в событии onTextChanged.

Изменить: после некоторых проверок кажется, что это поведение является ИНКОНИСТИЧЕСКИМ МЕЖДУ API, начиная с Marshmallow (API 23). Попробуйте изменить свой код на следующее:

 final float scale = context.getResources().getDisplayMetrics().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<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,drugs); drugNameAutoComplete.setAdapter(adapter); drugNameAutoComplete.setDropDownAnchor(R.id.drugNameEditText); drugNameAutoComplete.setDropDownVerticalOffset(verticalOffsetDP); drugNameAutoComplete.setDropDownHeight(dropDownHeightDP); 

И ваш XML к следующему:

 <AutoCompleteTextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/drugNameEditText" android:enabled="true" android:singleLine="true" android:layout_below="@+id/lookingForView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:dropDownVerticalOffset="50dp" android:dropDownAnchor="@id/drugNameEditText" android:dropDownHeight="200dp" android:hint="@string/drug_name" /> 

Обратите внимание, что вам нужно рассчитать DP на основе размеров экрана в коде. Я получил пример кода из отличного принятого ответа в этой теме: Android и установка ширины и высоты программно в единицах dp

Причина, по которой вам нужно установить dropDownHeight, заключается в том, что в противном случае у Android есть поведение, чтобы подтолкнуть его к верхней части экрана, если список выходит за границы высоты представления, что еще более усложняет проблемы с перемещением. Если вы на самом деле не возражаете против этого (некоторые люди этого не делают, зависит от настройки вашего представления), вы можете удалить dropDownHeight из программных и XML.

Я должен отметить, что эти изменения все еще не делают вещи ТОЧНО одинаковыми между Marshmallow и другими API. Похоже, что все еще есть разница в нескольких пикселях. Но это довольно близко.

У меня была такая же проблема, и через несколько часов я нашел решение.

Вы должны изменить:

android:layout_width="wrap_content" для android:layout_width="match_parent"

Надеюсь, это сработает и для вас.