Android AutoCompleteTextView弹出窗口在显示后移动

13

当我使用自动完成文本视图时,除了一直在正确的位置(在文本视图下方)和相当低的位置之间不停地切换外,其他情况都能正常工作。它开始时就是错的,但几乎立即移动到正确的位置。然而,由于每输入一个字母或删除一个字母就会发生一次这种情况,因此非常恼人。我正在使用Android Studio。

似乎有两个事件同时尝试确定布局。有时它会固定在其中一个位置。

**我使用了一个自定义适配器来减缓过滤过程的速度,发现当输入文本时,它会移动到不正确的位置,然后当过滤完成时,它会移回到正确的位置。

Incorrect

Incorrect

Correct:

Correct

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

如果我去掉dropDownVeticalOffset,我会在正确的值和这个之间闪烁 -

输入图像描述


尝试指定一个高度? - iWumbo
5个回答

4

要更改此位置,请使用dropDownAnchor属性并引用另一个视图ID。(在自动完成下方的视图)

android:dropDownAnchor

用于锚定自动完成下拉列表的视图。如果未指定,则使用文本视图本身。

您还有许多下拉列表属性..

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


我尝试了这个,但没有任何效果。虽然我不确定过滤与布局有什么关系。 - ghostbust555

2

你是否在另一个AutoCompleteTextView上使用了相同的id?如果将带有相同id的两个视图包含在内,我可以重现你描述的行为。


不好意思:( 我刚刚检查了一下,然后重新命名了它以确保。 - ghostbust555

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

1
这并没有帮助。这些也是默认值,所以我不明白它们会有什么影响? - ghostbust555

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之间的事情完全相同。看起来还有几个像素的差异。但它变得非常接近。

0

我曾经遇到过同样的问题,花费了太多时间后终于找到了解决方案。

你应该将:

android:layout_width="wrap_content" 改为 android:layout_width="match_parent"

希望这对你也有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接