16

我有一个 AutoCompleteTextView,它像往常一样在用户输入 3 个字母后提供建议。一旦我触摸建议列表以隐藏软键盘,我想要一次。我在下面对表格布局所做的操作仅在单击建议列表以外的任何位置时隐藏键盘。

XML

<TableRow
    android:id="@+id/tableRow2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center" >

    <AutoCompleteTextView
        android:id="@+id/auto_insert_meds"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:ems="15"
        android:inputType="textVisiblePassword|textMultiLine"
        android:scrollHorizontally="false"
        android:text=""
        android:textSize="16sp" />
</TableRow>

爪哇

TableLayout tbl = (TableLayout) findViewById(R.id.main_table);
tbl.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        in.hideSoftInputFromWindow(v.getWindowToken(), 0);
        return true;
    }
});

自定义列表的 XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/medlist_linear_layout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

        <TextView
        android:id="@+id/med_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scrollHorizontally="false"
        android:padding="3dp"
        android:textColor="@android:color/white" />

</LinearLayout>
4

12 回答 12

26

使用OnItemClickListener. 希望这有效:)

AutoCompleteTextView text = (AutoCompleteTextView) findViewById(R.id.auto_insert_meds);

text.setOnItemClickListener(new OnItemClickListener() {

  @Override
  public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    in.hideSoftInputFromWindow(arg1.getWindowToken(), 0);

  }

});

更新

用这个

in.hideSoftInputFromWindow(arg1.getApplicationWindowToken(), 0);

代替 -

in.hideSoftInputFromWindow(arg1.getWindowToken(), 0);
于 2013-02-04T01:29:19.490 回答
17

正如 chakri Reddy 建议的那样:

它对我有用,我刚刚更换了

这:

 in.hideSoftInputFromWindow(arg1.getWindowToken(), 0);

和:

 in.hideSoftInputFromWindow(arg1.getApplicationWindowToken(), 0);
于 2015-09-21T05:30:37.033 回答
9

1) 将 AutoCompleteTextView 下拉高度更改为 MATCH_PARENT

setDropDownHeight(LinearLayout.LayoutParams.MATCH_PARENT);

2) 通过覆盖 AutoCompleteTextView 适配器的 getView() 来关闭软键盘

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = super.getView(position, convertView, parent);
    v.setOnTouchListener(new View.OnTouchListener() {

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

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

            return false;
        }
    });

    return v;
}
于 2013-07-10T07:58:53.600 回答
5

在类似的线程中找到了这段代码。希望能帮助到你:

    private void hideKeyboard() {   
        // Check if no view has focus:
        View view = this.getCurrentFocus();
        if (view != null) {
            InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
}

链接到原始帖子。请注意,这不是公认的答案。

于 2015-03-17T12:24:31.803 回答
5

如果即使点击/单击也需要隐藏键盘(在使用下拉菜单(TextInputLayout + MaterialAutoCompleteTextView)的下拉场景中,以防止从预定义的下拉菜单中选择时出现键盘)

(科特林)

autoCompleteTextView.inputType = InputType.TYPE_NULL

RG

于 2020-10-19T12:29:05.890 回答
1

如果这对任何人都有帮助,我也有类似的情况。

我的 AutoCompleteTextView 显示在没有标题栏的 DialogFragment 上,因为我getWindow().requestFeature(Window.FEATURE_NO_TITLE);onCreateDialog()

我在后面添加了以下行FEATURE_NO_TITLE,结果列表显示在键盘上:

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialogo=super.onCreateDialog(savedInstanceState);
        dialogo.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        dialogo.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
        return dialogo;
    }
于 2014-08-21T22:10:07.947 回答
1
AutoCompleteTextView autoText= (AutoCompleteTextView) findViewById(R.id.auto_insert_meds);

autoText.setOnItemClickListener(new OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

    }
  }
});
于 2016-12-30T12:14:05.413 回答
1

我为此工作了一整天,并设法开发了一个扩展(材料)AutoCompleteTextView 的自定义视图,并使用反射在弹出窗口上设置 OnTouchListener 以在触摸键盘时隐藏键盘,这样您就可以继续在 TextView 中输入,直到您准备滚动浏览建议。

希望有人觉得它有用。

https://gist.github.com/MachFour/c6b5252292dd3bfe18d6b1141f137d32

于 2020-07-08T08:56:35.870 回答
1
autoCompleteTextView.setInputType(InputType.TYPE_NULL);
于 2020-11-22T04:54:43.573 回答
0

试试这个家伙..它会工作..!!!

 AutoCompleteTextView auto_text = (AutoCompleteTextView)findViewById(R.id.auto_insert_meds);
 auto_text.setOnItemClickListener(new OnItemClickListener() {
 @Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
{
   InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
   in.hideSoftInputFromWindow(arg1.getApplicationWindowToken(), 0);
} });
于 2015-08-04T10:33:38.893 回答
0

我已经使用 TextWatcher 来检测用户何时输入了至少 3 个字母(这会触发下载 API),如下所示:

    searchAutoComplete.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // when the user has clicked on an item in the list, it will trigger onTextChanged.
            // To avoid querying the server and showing the dropdown again, use searchAutoComplete.isPerformingCompletion()
            if (!searchAutoComplete.isPerformingCompletion()){
                if (s != null && s.length() >= 3) {
                    downloadSearchResults(s.toString());
                } else {
                    searchAutoComplete.dismissDropDown();// hide dropdown after user has deleted characters and there's less than 3 visible
                }
            } else {
                // user has clicked on a list item so hide the soft keyboard
                InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                if (in != null) in.hideSoftInputFromWindow(searchAutoComplete.getApplicationWindowToken(), 0);
            }
        }

        @Override
        public void afterTextChanged(Editable s) { }
    });
于 2018-10-26T12:40:32.363 回答
0

更好的解决方案是观察焦点。在 OnItemClickListener 中隐藏键盘仅在选择项目时才隐藏键盘,但从前一个元素(例如 EditText)的焦点丢失和回车丢失但键盘显示。这里是 Kotlin 中的代码

yourAutoCompleteTextView.setOnFocusChangeListener { v, hasFocus ->
    if (hasFocus) {
        val inputMethodManager = v.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(v.applicationWindowToken, 0)
   }
}
于 2021-03-07T23:45:01.377 回答