2016-02-13 9 views
12

Kiedy używam widoku automatycznego, wszystko działa poprawnie, z wyjątkiem tego, że przełącza się między dwiema pozycjami: właściwą pod spodem i nieco niżej. Zaczyna się źle, ale prawie natychmiast przesuwa się do właściwej pozycji. Jest to jednak bardzo irytujące podczas pisania lub cofania, jak to ma miejsce w przypadku każdej litery. Używam Android Studio.Wyskakujące okienko Android AutoCompleteTextView porusza się po wyświetleniu

Wygląda na to, że dwa zdarzenia próbują jednocześnie zdecydować o układzie. Czasami będzie trzymać się w jednej lub w drugiej pozycji.

** Zwolniłem proces filtrowania za pomocą niestandardowego adaptera i wygląda na to, że po wprowadzeniu tekstu przesuwa się w niewłaściwą pozycję, a po zakończeniu filtrowania wraca do właściwej pozycji.

Nieprawidłowa

Incorrect

Poprawnie:

Correct

Java (w 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); 

I układ Code

<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" /> 

Jeśli usunąć dropDownVeticalOffset dostaję migający między prawidłową wartość i to-

enter image description here

+0

Spróbuj podać wysokość? – iWumbo

Odpowiedz

4

Aby zmienić położenie użycia atrybutu dropDownAnchor i odniesienie do innego widoku id. (zobacz poniżej autouzupełniania)

android: dropDownAnchor

Zobacz zakotwiczyć listę rozwijaną do autouzupełniania. Jeśli nie jest określony, używany jest sam widok tekstowy.

i masz wiele atrybutów dla rozwijanej ..

lepiej użyć wdrożyć adapter filtru do autouzupełniania i przekazać wprowadzony tekst z OnQueryTextListener autouzupeĹ,nianiu i ustawić wybrany tekst nazywając adapter.getitem.

+0

To nie działa. Zobacz zaktualizowany post – ghostbust555

+0

Moja odpowiedź została zaktualizowana. – SreeAndroidDev

+0

Próbowałem to i nic. Nie jestem pewien, co filtrowanie ma wspólnego z układem. – ghostbust555

3

Zmień 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" /> 
+0

To nie pomogło. Są to również wartości domyślne, więc nie widzę, w jaki sposób będą one miały wpływ? – ghostbust555

2

Czy przypadkiem nie używać tego samego identyfikatora po drugiej AutoCompleteTextView? Mogę odtworzyć zachowanie, które opisujesz, włączając dwa widoki o tym samym identyfikatorze.

+0

Nie :(właśnie sprawdziłem, a następnie zmieniłem jego nazwę, aby się upewnić. – ghostbust555

1

Z jakiegoś powodu miałem ten sam problem z moim najnowszym API. Rozwiązałem problem, jawnie ustawiając dropDownAnchor, dropDownVerticalOffset i dropDownHeight zarówno w zdarzeniu XML, jak i onTextChanged.

Edycja: Po pewnym sprawdzeniu wygląda na to, że to zachowanie jest NIEPOTRZEBNE POMIĘDZY interfejsami API zaczynającymi się od Marshmallow (API 23).Spróbuj zmienić swój kod do następujących:

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); 

i Twojego XML do następujących:

<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" /> 

Zauważ, że musisz obliczyć DP na podstawie wymiarów ekranu w kodzie. Mam przykład kodu z doskonałej, zaakceptowanej odpowiedzi w tym wątku: Android and setting width and height programmatically in dp units

Powodem, dla którego musisz ustawić również dropDownHeight, jest to, że w przeciwnym razie Android zachowuje się tak, aby przesunąć go na górę ekranu, jeśli lista wykracza poza ten obszar. granice wysokości widoku, dodatkowo komplikując poruszające się problemy. Jeśli nie masz nic przeciwko temu (niektórzy nie, zależy to od konfiguracji widoku), możesz usunąć dropDownHeight zarówno z poziomu programowego, jak i XML.

Należy zauważyć, że te zmiany nadal nie sprawiają, że rzeczy DOKŁADNIE są takie same między programem Marshmallow i innymi interfejsami API. Wygląda na to, że wciąż jest kilka różnic w pikselach. Ale robi się całkiem blisko.

0

Miałem ten sam problem i zbyt wiele godzin później znalazłem rozwiązanie.

należy zmienić:

android:layout_width="wrap_content" do android:layout_width="match_parent"

Mam nadzieję, że pracuje dla Ciebie.

Powiązane problemy