Android AutoCompleteTextView弹出窗口显示后移动

时间:2016-02-13 21:11:53

标签: java android xml android-studio

当我使用autocompletetextview时,一切正常,除了它在两个位置之间切换:正确的位于textview下面并且相当低一些。它开始出错,但几乎立即移动到正确的位置。然而,当输入或退格时,这对于每个字母都是非常烦人的。我正在使用android studio。

好像两个事件同时试图决定布局。有时它会粘在一个位置或另一个位置。

**我使用自定义适配器减慢了过滤过程,看起来当输入文本时它会移动到错误的位置,然后当过滤完成后,它会移回正确的位置。

不正确的

Incorrect

正确:

Correct

java(在OnCreate()中) -

 TIdSSLVersion = (sslvSSLv2, sslvSSLv23, sslvSSLv3, sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2);

布局代码 -

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

如果我删除了dropDownVeticalOffset,我会在正确的值与此之间闪烁 -

enter image description here

5 个答案:

答案 0 :(得分:4)

要更改此位置,请使用dropDownAnchor属性并引用另一个视图ID。 (在自动填充下查看)

<强>机器人:dropDownAnchor

查看以将自动完成下拉列表锚定到。如果未指定,则使用文本视图本身。

你有很多下拉属性..

最好使用实现Filter来自动完成适配器并从自动完成的OnQueryTextListener传递输入的文本,并通过调用adapter.getitem设置所选文本。

答案 1 :(得分: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" />

答案 2 :(得分:2)

您是否有机会在其他AutoCompleteTextView上使用相同的ID?我可以通过包含两个具有相同id的视图来重现您描述的行为。

答案 3 :(得分:1)

出于某种原因,我在使用最新的API时遇到了同样的问题。我通过在XML和onTextChanged事件中明确设置 dropDownAnchor dropDownVerticalOffset dropDownHeight 来解决了这个问题。

编辑:经过一些检查后,似乎这种行为在以Marshmallow(API 23)开头的API之间是不一致的。尝试将代码更改为以下内容:

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 and setting width and height programmatically in dp units

你必须设置dropDownHeight的原因是因为如果列表超出视图的高度边界,Android会有将其推送到屏幕顶部的行为,这进一步使移动问题复杂化。如果你真的不介意(有些人不这样做,取决于你的视图设置),你可以从程序和XML中删除dropDownHeight。

我应该注意到,这些更改在Marshmallow和其他API之间仍然没有完全相同。看起来仍然存在一些像素区别。但它非常接近。

答案 4 :(得分:0)

我遇到了同样的问题,太多小时后我找到了解决方案。

你应该改变:

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

我希望它也适合你。