用户从下拉列表中选择项目后禁用 Android AutoCompleteTextView

Posted

技术标签:

【中文标题】用户从下拉列表中选择项目后禁用 Android AutoCompleteTextView【英文标题】:Disable Android AutoCompleteTextView after user selects item from drop down 【发布时间】:2011-12-24 13:07:51 【问题描述】:

我正在使用 androidAutoCompleteTextViewCursorAdapter 为应用添加自动完成功能。在视图的onItemClickListener() 中(即当用户触摸自动完成的下拉项目之一时)我检索文本并将其放置在 EditText 中,以便用户可以在需要时对其进行修改。

但是,当我在 TextView 上调用 setText() 时,会触发自动完成行为并再次显示下拉菜单。如果用户使用键盘输入新文本,我只想显示下拉列表。有没有办法做到这一点?

【问题讨论】:

我在这里做类似的事情!!! ***.com/questions/12854336/… 【参考方案1】:

当我们点击AutoCompleteTextView.onTextChanged()中建议的项目时,在onItemClick之前执行 因此,为避免这种情况,请尝试以下代码..

autocompletetextview.addTextChangedListener(new TextWatcher() 
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) 

    

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) 
        if (autocompletetextview.isPerformingCompletion()) 
            // An item has been selected from the list. Ignore.
         else 
            // Perform your task here... Like calling web service, Reading data from SQLite database, etc...
        
    

    @Override
    public void afterTextChanged(final Editable editable) 

    
);

【讨论】:

是的!这正是我所需要的。你是对的,我的应用在用户选择列表中的一个项目后进行了 API 调用,然后重新填充列表并显示它!现在已经解决了,谢谢! 谢谢,autocompletetextview.isPerformingCompletion() 刚刚救了我。 最适合我的最简单的解决方案。谢谢!【参考方案2】:

不同的方法。 我同意dismissDropDown() 有效,但就我而言,它没有按预期工作。所以,我用了:

autoCompleteTextView.setDropDownHeight(0);

如果你想再次显示下拉列表,你可以使用

autoCompleteTextView.setDropDownHeight(intValue);

【讨论】:

是的,我也试过了,但我怎么知道intValue?每个搜索伙伴都不同:) 就我而言,我使用的是硬编码值。这就像一个最大值,如果您有较少的特定选择项目,高度将减少以弥补您的新选择。因此,使用硬编码值没有任何缺点。【参考方案3】:

如果你想关闭 AutoCompleteTextView 的下拉菜单,你应该使用它的 post(Runnable r) 方法。它对我有用:)

这是一个例子:

mAutoCompleteTextView.post(new Runnable() 
    public void run() 
        mAutoCompleteTextView.dismissDropDown();
    

【讨论】:

我还在我的活动中的 onConfigurationChanged 中添加了相同的 sn-p 这对我不起作用,下拉菜单又出现了。 @Vucko 请检查我的答案。这个技巧对我也不起作用。【参考方案4】:

经过几个小时的破解后回答我自己的问题:事实证明,您应该实现自己的OnItemClickListener,而不是依靠现有的点击侦听器来填充 TextView。我最初实现了 onItemClickListener 因为它使用 Cursor.toString() 的结果来填充文本视图。要更改输出字符串,您应该在 CursorAdapter 中实现 convertToString(Cursor)。返回的 CharSequence 将填充到文本视图中。

这样做还可以防止下拉菜单再次出现(因为 setText() 会触发完成行为,但默认的 onItemClickListener 不会)。

【讨论】:

如果我的适配器扩展BaseAdapter,而不是CursorAdapter?我没有这样的方法,但我有同样的问题(我覆盖了getFilter 方法)。 啊,找到了:你需要重写Filter.convertResultToString来提供字符串表示。【参考方案5】:

您可以使用 AutoCompleteTextView 对象的dismissDropDown() 方法。看看documentation。

【讨论】:

我想阻止下拉菜单在输入新键之前显示。如果我使用dismissDropDown(),下拉菜单会在被解雇之前短暂显示。 如果您将方法调用放在 onItemClickListener() 中,当您单击一项时,它应该关闭列表。这不是你想要的吗? @Vucko 某些东西可能将焦点放在了焦点上,因此光标又回到了 autoCompleteTextBox,导致列表重新出现。 我确实同时解决了它。不记得现在怎么样了:D

以上是关于用户从下拉列表中选择项目后禁用 Android AutoCompleteTextView的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一个下拉菜单值禁用下拉菜单

通过 Typescript 和 HTML 选择选项后,如何禁用整个选择下拉字段?

当第一个选择的项目框 1 更改时重置选项下拉菜单 2 mysql

根据显示的数据表值禁用下拉列表项

用户选择选项时禁用文本输入

Laravel-从下拉列表中选择值后自动填充输入