我使用以下代码将文本设置为AutoCompleteTextView字段。但我注意到,当我设置某些文本(不是所有文本,而是一些文本)时,它会自动弹出下拉菜单。如果我不请求焦点,它会更好,但只是更好,并不完全正确。我尝试过dissmissDropDwon(),它不起作用。那么,在设置文本和焦点后,有什么方法可以阻止下拉菜单显示吗?
actv.setText("Tim Hortons");
actv.setSelection(0, actv.getText().length());
actv.requestFocus();
actv.dismissDropDown(); // doesn't help谢谢!
发布于 2011-04-05 09:09:16
为了回答我自己的问题,以防有人遇到同样的问题:
AutoCompleteTextView的一个特征是,如果您以编程方式更改它的文本,如果满足以下两个条件,它将下拉选择列表: 1.它具有焦点;2.列表超过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)actv.getAdapter();// mAdapter是一个类字段actv.setText("Tim Hortons");actv.setSelection(0,actv.getText().length());actv.setAdapter((ArrayAdapter)null);//关闭适配器actv.requestFocus();处理程序= new handleMessage(){ public void Handler() {ArrayAdapter };Message msg = mHandler.obtainMessage();msg.obj = actv;handler.sendMessageDelayed(msg,200);// 200ms后重新打开
这里的诀窍是将ACTV的适配器设置为空。由于没有适配器,系统当然不会弹出下拉列表。但该消息将在编程延迟200ms后将适配器重置回ACTV,ACTV将正常工作。
这对我来说很有效!
发布于 2011-09-06 21:17:49
另一种解决方案是在设置文本之前清除焦点:
mContactTxt.setFocusable(false);
mContactTxt.setFocusableInTouchMode(false);
mContactTxt.setText("");
mContactTxt.setFocusable(true);
mContactTxt.setFocusableInTouchMode(true);发布于 2011-08-05 02:49:43
您可以尝试以下步骤:
actv.setThreshold(1000);
actv.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v,MotionEvent event) { actv.setThreshold(1);return false;}}));
https://stackoverflow.com/questions/5495225
复制相似问题