我使用以下代码将文本设置为AutoCompleteTextView字段.但我注意到,当我将某些文本(不是所有文本,而是一些文本)设置为它时,它会自动弹出下拉列表.如果我不要求焦点,那会更好,但更好,不完全正确.我试过dissmissDropDwon(),它没有帮助.那么,有没有办法在设置文本并关注它后停止显示下拉?
actv.setText("Tim Hortons");
actv.setSelection(0, actv.getText().length());
actv.requestFocus();
actv.dismissDropDown(); // doesn't help
Run Code Online (Sandbox Code Playgroud)
谢谢!
Ita*_*ana 20
另一种解决方案是在设置文本之前清除焦点:
mContactTxt.setFocusable(false);
mContactTxt.setFocusableInTouchMode(false);
mContactTxt.setText("");
mContactTxt.setFocusable(true);
mContactTxt.setFocusableInTouchMode(true);
Run Code Online (Sandbox Code Playgroud)
小智 16
您可以尝试以下步骤:
设置文本时,还要将"阈值"值设置为较大的值,以便下拉列表不会出现.
actv.setThreshold(1000);
Run Code Online (Sandbox Code Playgroud)然后覆盖OnTouch以将阈值设置回1.
actv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
actv.setThreshold(1);
return false;
}
});
Run Code Online (Sandbox Code Playgroud)wwy*_*wyt 13
如果有人遇到同样的问题,请回答我自己的问题:
AutoCompleteTextView的一个特征是,如果以编程方式更改其文本,如果满足以下两个条件,它将下拉选择列表:1.它具有焦点; 这份清单超过30件物品.
实际上,这种行为,恕我直言,一个设计缺陷.当程序将文本设置为AutoCompleteTextView时,这意味着文本已经正确,没有必要弹出过滤后的列表供用户进一步选择.
actv.setText("Tim Hortons");
actv.setSelection(0, actv.getText().length());
actv.requestFocus();
actv.dismissDropDown(); // doesn't help
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,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
Run Code Online (Sandbox Code Playgroud)这里的技巧是将ACTV的适配器设置为null.因为没有适配器,系统当然不会弹出下拉列表.但该消息将在200ms的编程延迟后将适配器重置回ACTV,并且ACTV将照常正常工作.
这适合我!
eer*_*ock 11
您还可以启用/禁用下拉菜单,如下所示:
// disable
actv.setDropDownHeight(0);
// enable
actv.setDropDownHeight(LayoutParams.WRAP_CONTENT);
Run Code Online (Sandbox Code Playgroud)
也许到了很晚,但是我已经找到了解决该问题的好方法:
设置文本之前禁用过滤,然后再启用文本(而不是集中播放或延迟播放)。在这种情况下,您应该使用自定义控件。
请参见下面的示例:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
和用法:
text.setSearchEnabled(false);
text.setText("Text you want to set");
// optional, if you also want to set correct selection
text.setSelection(text.getText().length());
text.setSearchEnabled(true);
Run Code Online (Sandbox Code Playgroud)