在Android的AutocompleteTextView中,当下拉列表滚动时关闭键盘

5

我有一个自动补全文本视图,将其链接到Web服务,因此它会在我键入时显示建议。现在,当用户开始滚动自动完成下拉列表时,如何隐藏软键盘?我浏览了网络,但没有找到任何方法来检测自动完成下拉列表上的触摸。


您可以使用http://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html和http://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html#hideSoftInputFromWindow%28android.os.IBinder,%20int%29。 - Sam
4个回答

8
我能提供的最好解决方案是,当用户开始滚动列表时隐藏键盘,如果用户再次触摸文本视图,则再次显示键盘。与其他解决方案不同,如设置dropDownHeight的高度,它几乎适用于大多数操作系统版本和设备。
以下是一个示例代码,用于在用户开始滚动时隐藏键盘。基本上,您需要在AutoCompleteTextView的适配器中创建一个触摸监听器。
public View getView(final int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    ViewHolder holder;
    if (convertView == null) {
        convertView = inflater.inflate(viewResourceId, parent, false);
        holder = new ViewHolder();
        init(convertView, holder);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    convertView.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getContext()
                        .getSystemService(
                                Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(
                        searchView.getWindowToken(), 0);
            }

            return false;
        }
    });

    setView(position, holder);
    return convertView;
}

谢谢,当我将setOnTouchListener部分包装在if (convertView!= null)中时,代码对我有效。 - Noor Hossain

2

我会采纳这个答案,或者采纳@ayorhan的答案,因为它确实是处理下拉选择滚动时隐藏键盘的最佳方式。

这是基于@ayorhan的解决方案的改编,适用于SimpleCursorAdapter。我不得不制作一个自定义SimpleCursorAdapter类:

public class SimpCursAdap extends SimpleCursorAdapter {

public SimpCursAdap(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
    super(context, layout, c, from, to, flags);

}

public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    view.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getContext()
                        .getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(
                        view.getApplicationWindowToken(), 0);
            }
            return false;
        }
    });
    return view;
   }
}

接下来你可以在任何地方实例化这个类:

final SimpleCursorAdapter adapter = new SimpCursAdap(aContext,
            aRowLayout,
            null,
            aColNames,
            aRowViewsIds,
            0);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
adapter.setStringConversionColumn(aValueColId);
autocompletetextview.setAdapter(adapter);

0

在 XML 中添加这行代码对我来说很有效

这将使键盘出现在滚动列表的后面。

android:dropDownHeight="wrap_content"

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接