我使用以下代码将文本设置为AutoCompleteTextView字段。但我注意到,当我将某些文本(不是所有文本,而是一些文本)设置为它时,它会自动弹出下拉列表。如果我不要求焦点,那会更好,但更好,不完全正确。我试过dissmissDropDwon(),它没有帮助。那么,有没有办法在设置文本并关注它后停止显示下拉?
actv.setText("Tim Hortons");
actv.setSelection(0, actv.getText().length());
actv.requestFocus();
actv.dismissDropDown(); // doesn't help
谢谢!
答案 0 :(得分:20)
另一种解决方案是在设置文本之前清除焦点:
mContactTxt.setFocusable(false);
mContactTxt.setFocusableInTouchMode(false);
mContactTxt.setText("");
mContactTxt.setFocusable(true);
mContactTxt.setFocusableInTouchMode(true);
答案 1 :(得分:16)
您可以尝试以下步骤:
设置文本时,还要将“阈值”值设置为较大的值,以便下拉列表不会出现。
actv.setThreshold(1000);
然后覆盖OnTouch以将阈值设置回1。
actv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
actv.setThreshold(1);
return false;
}
});
答案 2 :(得分:12)
如果有人遇到同样的问题,请回答我自己的问题:
AutoCompleteTextView的一个特征是,如果以编程方式更改其文本,如果满足以下两个条件,它将下拉选择列表:1。它具有焦点;这份清单超过30件物品。
这个行为实际上是恕我直言,一个设计缺陷。当程序将文本设置为AutoCompleteTextView时,这意味着文本已经正确,没有必要弹出过滤后的列表供用户进一步选择。
actv.setText("Tim Hortons");
actv.setSelection(0, actv.getText().length());
actv.requestFocus();
actv.dismissDropDown(); // doesn't help
在上面的代码中,requestFocus()强制ACTV获得焦点,这会导致下拉列表弹出。我试着不要求焦点,相反,我在设置文本后调用了clearFocus()。但这种行为非常......非常自然。 dissmissDropdown()没有帮助因为....我不知道,它只是没有帮助。所以,经过多次努力,我想出了这个解决方法:
将上述代码更改为:
mAdapter = (ArrayAdapter<String>)actv.getAdapter(); // mAdapter is a class field
actv.setText("Tim Hortons");
actv.setSelection(0, actv.getText().length());
actv.setAdapter((ArrayAdapter<String>)null); // turn off the adapter
actv.requestFocus();
Handler handler = new Handler() {
public void handleMessage(Message msg) {
((AutoCompleteTextView)msg.obj).setAdapter(mAdapter);
};
Message msg = mHandler.obtainMessage();
msg.obj = actv;
handler.sendMessageDelayed(msg, 200); // turn it back on after 200ms
这里的技巧是将ACTV的适配器设置为null。因为没有适配器,系统当然不会弹出下拉列表。但该消息将在200ms的编程延迟后将适配器重置回ACTV,并且ACTV将照常正常工作。
这对我有用!
答案 3 :(得分:10)
你也可以这样启用/禁用下拉列表:
// disable
actv.setDropDownHeight(0);
// enable
actv.setDropDownHeight(LayoutParams.WRAP_CONTENT);
答案 4 :(得分:5)
也许是为时已晚,但我已找到解决此问题的优雅解决方案:
在设置文本并在之后启用之前禁用过滤(而不是使用焦点或/和延迟)。在这种情况下,您应该使用自定义控件。
见下面的例子:
break
用法:
public class CustomCompliteTextView extends AutoCompleteTextView {
private boolean mIsSearchEnabled = true;
public CustomCompliteTextView(Context context) {
super(context);
}
public CustomCompliteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomCompliteTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setSearchEnabled(boolean isEnabled) {
mIsSearchEnabled = isEnabled;
}
@Override
protected void performFiltering(CharSequence text, int keyCode) {
if (mIsSearchEnabled) {
super.performFiltering(text, keyCode);
}
}
}
答案 5 :(得分:4)
setText("someText",false)
false
表示它没有过滤
答案 6 :(得分:3)
有趣的伎俩。 100%工作:)
tv.setThreshold(Integer.MAX_VALUE);
tv.setText(station.getName());
tv.setThreshold(1);
答案 7 :(得分:3)
act.post(new Runnable()
{
@Override
public void run()
{
act.dismissDropDown();
}
});
工作得很好!
答案 8 :(得分:2)
wwyt,我只是通过移除适配器来重复使用你的技巧,这些是解除下拉/关闭下拉列表的基本要素。
AutoCompleteTextView tvSuburbs;
ArrayAdapter<Suburb> a = (ArrayAdapter<Suburb>) tvSuburbs.getAdapter();
tvSuburbs.setAdapter(null); // Remove the adapter so we don't get a dropdown
tvSuburbs.setText(s.name); // when text is set programmatically.
tvSuburbs.setAdapter(a); // Restore adapter
答案 9 :(得分:1)
以XML格式试用...
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:autoText="false"
/>
答案 10 :(得分:1)
你可以尝试
searchInput.setAdapter((ArrayAdapter<String>) null);
searchInput.setText(text);
searchInput.setAdapter(adapter);
答案 11 :(得分:1)
我也面对一个场景,我以这种方式解决了。
dismissDropDown()
。请找到以下代码段
if(null != testText && testText.length() != 0) {
mAutoCompleteSearch.setText(incomingActivity.toString());
mAutoCompleteSearch.dismissDropDown(); //Dismiss the drop down
} else {
mAutoCompleteSearchDocketActivity.setText("");
// Here it(drop down) will be shown automatically
}
希望,这会对某人有所帮助,干杯!
答案 12 :(得分:0)
我用这段代码解决了同样的问题:
contacts_search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
contacts_search.dismissDropDown();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
contacts_search.dismissDropDown();
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
contacts_search.dismissDropDown();
}
});
此处,contacts_search是我的AutoCompleteTextView
答案 13 :(得分:0)
dismissDropDown()在适配器中运行良好:
SimpleCursorAdapter autoCompleteAdapter = new SimpleCursorAdapter(this,
android.R.layout.select_dialog_item, null,
new String[] { ContactsContract.Contacts.DISPLAY_NAME },
new int[] { android.R.id.text1 }, 0);
mSearchView.setAdapter(autoCompleteAdapter);
autoCompleteAdapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
mSearchView.dismissDropDown();
// return your query code
}
});
希望它会有所帮助。
答案 14 :(得分:0)
我需要添加一些延迟来使这件事工作。
这对我有用:
new Handler().postDelayed(new Runnable() {
public void run() {
if(carModel.isPopupShowing())
carModel.dismissDropDown();
}}, 500);
答案 15 :(得分:0)
这里的目的是使用AutoCompleteTextView隐藏下拉列表。在布局文件中将dropDownHeight设置为零。
<!--Skipping all other attributes for simplicity-->
<AutoCompleteTextView
android:id="@+id/address_bar"
android:dropDownHeight="0dp"
/>
就我而言,我有GridView,并且该视图上方有地址栏。我想根据AutoCompleteTextView中的用户输入过滤GridView中的项目,而不需要TextView向我显示下拉列表。
答案 16 :(得分:0)
在AppCompatAutoCompleteTextView
中不能setTreshold()
。如果使用AppCompatAutoCompleteTextView
类,可以尝试以下方法:
actv.setText("Tim Hortons");
actv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
actv.setText("");
}
});
答案 17 :(得分:0)
我想你正在使用这种结构
<TextInputLayout>
<AutoCompleteTextView/>
</TextInputLayout>
要禁用下拉菜单,您只需要在 isEnabled
中将 TextInputLayout
字段设置为 false