Подтвердить что ты не робот

Всплывающее окно 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, я получаю мерцание между правильным значением и этим -

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

4b9b3361

Ответ 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"

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