Всплывающее окно 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, я получаю мерцание между правильным значением и этим -
![введите описание изображения здесь]()
Ответы
Ответ 1
Чтобы изменить эту позицию, используйте атрибут dropDownAnchor и укажите другой идентификатор вида.
(просмотр под автозаполнением)
Android: dropDownAnchor
Просмотр привязки раскрывающегося списка автозаполнения. Если не указано, используется текстовое представление.
и у вас есть много атрибутов для выпадающего списка.
Вам лучше использовать утилиту Filter to autocomplete adapter и передать введенный текст из OnQueryTextListener из автозаполнения и установить выделенный текст, вызвав файл adapter.getitem.
Ответ 2
Измените свой xml на
<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" />
Ответ 3
Вы случайно использовали один и тот же идентификатор на другом автокомплектеTextView? Я могу воспроизвести описанное вами поведение, включив два представления с одним и тем же идентификатором.
Ответ 4
По какой-то причине у меня была такая же проблема с моей стороны с новейшим API. Я решил проблему, явно установив dropDownAnchor, dropDownVerticalOffset и dropDownHeight как в XML, так и в событии onTextChanged.
Изменить: после некоторой проверки это похоже на INCONSISTENT BETWEEN 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-интерфейсами. Похоже, что все еще есть разница в нескольких пикселях. Но это довольно близко.
Ответ 5
У меня была такая же проблема, и слишком много часов спустя я нашел решение.
Вы должны изменить:
android:layout_width="wrap_content"
до android:layout_width="match_parent"
Я надеюсь, что это сработает и для вас.