【问题标题】:AutoCompleteTextView: detecting when dropdown is dismissed and item is NOT selectedAutoCompleteTextView:检测何时关闭下拉菜单并且未选择项目
【发布时间】:2017-03-23 21:03:25
【问题描述】:

我需要知道用户何时在 AutoCompleteTextView 下拉列表之外点击以将其关闭(即,他们通过选择列表中的项目来关闭弹出窗口)。我已经设置了 setOnDismissListener(),如下所示:

    mAutoView.setOnDismissListener(new AutoCompleteTextView.OnDismissListener() {
        @Override
        public void onDismiss() {
            CharSequence msg = "isPerformingCompletion = " + mAutoView.isPerformingCompletion() +
                    "   Item selected at = " + mAutoView.getListSelection();
            Toast.makeText(getContext(), msg, Toast.LENGTH_LONG).show();
        }
    });

还有一个像这样的 OnItemClickListener:

 private AdapterView.OnItemClickListener mAutocompleteClickListener
        = new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // get selected item and pass it to result callback
    }
};

onDismiss 事件在 onItemClick 事件之前触发,不幸的是,在 onItemClick 事件触发之前,“isPerformingCompletion()”和“getListSelection()”方法都不会返回值。

任何人都可以建议一种无需列表选择即可检测解雇的方法吗?

【问题讨论】:

  • 在这种情况下你打算做什么?如果您不需要细粒度的计时,您可以使用典型的计时技巧。 postDelayed() Runnable in onDismiss() 用于适度的延迟期。在onItemClick() 中使用removeCallbacks() 取消Runnable。如果Runnable 运行,您就知道您在延迟期内没有收到相应的onItemClick()。可靠性很差,延迟时间很短。但由于实际事件由AutoCompleteTextView 中的ListPopupWindow 处理,我不确定您是否有选择。
  • 如果用户点击下拉菜单,我想显示一个小对话框来解释查找未列出项目的替代方法。正如您所建议的,我考虑过添加某种延迟,但我担心它不可靠。我是 java 和 Android 的新手,不知道该怎么做,所以感谢你让我进入 Runnable。我想我将调整 UI 以消除对指令的需求。可能需要额外点击一两次,但希望更直观。谢谢。

标签: android autocompletetextview


【解决方案1】:

下面的代码将检测到如果用户关闭 autocompletetextview 的下拉菜单,然后 onDismiss 它将使用 Geocode API 检查选择的输入,如果有结果则选择的输入有效,否则输入无效,所以在那个情况下,输入的文字会在几秒后消失。

mAutoView.setOnDismissListener {
    try {
        val fromLocationName = Geocoder(context).getFromLocationName(mAutoView.getText().toString(), 1)
        if (fromLocationName != null && fromLocationName.isNotEmpty()) {
            Log.d(TAG, "Address valid")
        } else {
            mAutoView.setText("")
            Log.d(TAG, "Address not valid")
        }
    } catch (e: Exception) {
        mAutoView.setText("")
        Log.d(TAG, "Address not valid with Exception")
    }
}

意味着您需要在 OnDismiss 中使用一种验证器,它将检查输入文本是否有效,基于验证您可以向用户指示输入的输入是否有效。

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多