首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何禁止AutoCompleteTextView的下拉列表显示?

如何禁止AutoCompleteTextView的下拉列表显示?
EN

Stack Overflow用户
提问于 2011-03-31 12:04:46
回答 18查看 27.2K关注 0票数 19

我使用以下代码将文本设置为AutoCompleteTextView字段。但我注意到,当我设置某些文本(不是所有文本,而是一些文本)时,它会自动弹出下拉菜单。如果我不请求焦点,它会更好,但只是更好,并不完全正确。我尝试过dissmissDropDwon(),它不起作用。那么,在设置文本和焦点后,有什么方法可以阻止下拉菜单显示吗?

代码语言:javascript
复制
actv.setText("Tim Hortons");
actv.setSelection(0, actv.getText().length());
actv.requestFocus();
actv.dismissDropDown();    // doesn't help

谢谢!

EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2011-04-05 09:09:16

为了回答我自己的问题,以防有人遇到同样的问题:

AutoCompleteTextView的一个特征是,如果您以编程方式更改它的文本,如果满足以下两个条件,它将下拉选择列表: 1.它具有焦点;2.列表超过30个项目。

这种行为实际上是一个设计缺陷。当程序将文本设置为AutoCompleteTextView时,这意味着文本已经是正确的,没有点弹出过滤列表供用户进一步选择。

代码语言:javascript
复制
actv.setText("Tim Hortons"); 
actv.setSelection(0, actv.getText().length()); 
actv.requestFocus(); 
actv.dismissDropDown();    // doesn't help 

在上面的代码中,requestFocus()强制ACTV获得焦点,这会导致弹出下拉菜单。我尽量不要求焦点,而是在设置文本后调用clearFocus()。但是他的行为非常……不自然。dissmissDropdown()没有帮助,因为....我不知道,就是没用。所以,经过一番努力,我想出了这个变通办法:

  1. 初始化小部件时,我记起了类字段中的适配器。
  2. 将上面的代码更改为:

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将正常工作。

这对我来说很有效!

票数 14
EN

Stack Overflow用户

发布于 2011-09-06 21:17:49

另一种解决方案是在设置文本之前清除焦点:

代码语言:javascript
复制
mContactTxt.setFocusable(false);
mContactTxt.setFocusableInTouchMode(false);
mContactTxt.setText("");            
mContactTxt.setFocusable(true);
mContactTxt.setFocusableInTouchMode(true);
票数 20
EN

Stack Overflow用户

发布于 2011-08-05 02:49:43

您可以尝试以下步骤:

  1. 在设置文本时,还要将阈值设置为较大的值,这样下拉列表就不会出现。

actv.setThreshold(1000);

  • Then覆盖OnTouch以将阈值设置回1。

actv.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v,MotionEvent event) { actv.setThreshold(1);return false;}}));

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5495225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档