【问题标题】:Don't set text value to AutoCompleteTextView on item click不要在项目单击时将文本值设置为 AutoCompleteTextView
【发布时间】:2018-10-22 14:37:58
【问题描述】:

我的屏幕上有一个 AutocompleteTextView。默认情况下,当用户单击 autocompletetextviews 的下拉项中的一项时,它会将此 autocompletetextview 的文本设置为该选定项的值。

有什么方法可以禁用它吗?那么当用户点击一个下拉项时,只有onItemClickListener触发了?

在onItemClickListener 中将值设置为“”不是一个选项。

autoCompleteTextView.setOnItemClickListener { adapterView, view, i, l -> 
    autoCompleteTextView.setText("")
}

因为我需要我的TextWatcher 不被触发

【问题讨论】:

  • 为什么? AutoCompleteTextView 的全部意义在于自动完成用户选择的内容。在任何情况下,只需取消设置您的 TextWatcher,设置文本,然后重置您的 TextWatcher。
  • @TheWanderer 以及我如何知道何时取消设置 textwatcher?我仍然需要监控用户输入。
  • 在您的项目点击侦听器被触发时取消设置,然后在该侦听器内将文本设置回空白后重置它。
  • @TheWanderer 这不是它的工作原理 1. 用户点击项目 2. 自动完成设置它对所选项目的价值 3. textwatcher 触发 4. onItemClickListener 触发 5. ...
  • 你不需要任何TextWatcher - 你所要做的就是在你传递给Filterable 的适配器中实现Filter AutoCompleteTextView - 请参见here可以间接做到这一点(不从头开始实现Filter)

标签: java android kotlin


【解决方案1】:

AutoCompleteTextView 使用这个类来检测对其下拉菜单的点击:

private class DropDownItemClickListener implements AdapterView.OnItemClickListener {
    public void onItemClick(AdapterView parent, View v, int position, long id) {
        performCompletion(v, position, id);
    }
}

在 performCompletion() 方法中,有这个调用来实际更改 TextView 的内容:

replaceText(convertSelectionToString(selectedItem));

这个replaceText() 方法是protected,这意味着你可以创建一个AutoCompleteTextView 的子类并覆盖它而不做任何事情:

public class MyAutoCompleteTextView extends AppCompatAutoCompleteTextView {

    public MyAutoCompleteTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void replaceText(CharSequence text) {
        // do nothing
    }
}

现在只需将您的 <AutoCompleteTextView> 标签替换为 <com.example.yourprojecthere.MyAutoCompleteTextView> 标签,您就应该准备就绪了。

【讨论】:

  • 哇!谢谢。工作很棒。有时我想知道有些人是如何知道这些细节的=)?你遇到过同样的问题吗?
  • 在这种情况下,我在阅读您的问题之前并不知道。我查看了AutoCompleteTextView 的源代码,并在几分钟内找到了相关代码。有些东西会跳出来,比如构造函数中的这一行:mPopup.setOnItemClickListener(new DropDownItemClickListener());
  • @Dannie 那么你需要TextWatcher 做什么?为什么要“观看”输入的文本?用于过滤建议目的?如果是这样,请在您的 Filterable 适配器中使用 Filter,不要使用来自使用 TextWatcher 的那些变通方法
  • @pskink 我需要它来获取输入的文本以查询服务器,而自动完成功能只是过滤我现在拥有的内容。所以基本上我有一个新的服务器调用,当用户输入数据时(当然有去抖动器)。但是,当用户从下拉列表中选择一个项目时,我不想进行最后一次不必要的调用,因为触发了 textwatcher。我仍然喜欢这样。 TextWatcher 处理新输入,AutoComplete 处理我拥有的数据的过滤
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 2017-10-15
  • 2012-09-28
相关资源
最近更新 更多