当我使用autocompletetextview时,一切正常,除了它在两个位置之间切换:正确的位于textview下面并且相当低一些。它开始出错,但几乎立即移动到正确的位置。然而,当输入或退格时,这对于每个字母都是非常烦人的。我正在使用android studio。
好像两个事件同时试图决定布局。有时它会粘在一个位置或另一个位置。
**我使用自定义适配器减慢了过滤过程,看起来当输入文本时它会移动到错误的位置,然后当过滤完成后,它会移回正确的位置。
不正确的
正确:
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,我会在正确的值与此之间闪烁 -
答案 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"
我希望它也适合你。