按下返回键时隐藏软键盘

Posted

技术标签:

【中文标题】按下返回键时隐藏软键盘【英文标题】:Hide Soft keyboard on return key press 【发布时间】:2014-12-26 00:49:49 【问题描述】:

我在 SO 上搜索了六个其他答案,但没有找到一个有效的答案。我要做的就是在用户按下回车按钮时关闭软键盘。 (相当于极其简单的 ios 'resignKeyboard' 调用。)在下面的代码中,不会调用 onEditorAction 方法。我在我的 XML 文件中设置了一个 EditText 视图,我的片段中的代码如下:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        fragView = inflater.inflate(R.layout.fragment_encrypt2, container, false);
        textField = (EditText) fragView.findViewById(R.id.textField);

        textField.setOnEditorActionListener(new TextView.OnEditorActionListener() 

            @Override
            public boolean onEditorAction(TextView arg0, int actionId,
                                          KeyEvent arg2) 
                // hide the keyboard and search the web when the enter key
                // button is pressed
                if (actionId == EditorInfo.IME_ACTION_GO
                        || actionId == EditorInfo.IME_ACTION_DONE
                        || actionId == EditorInfo.IME_ACTION_NEXT
                        || actionId == EditorInfo.IME_ACTION_SEND
                        || actionId == EditorInfo.IME_ACTION_SEARCH
                        || (arg2.getAction() == KeyEvent.KEYCODE_ENTER)) 
                    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(textField.getWindowToken(), 0);

                    return true;
                
                return false;
            
        );

        // Inflate the layout for this fragment
        return fragView;//inflater.inflate(R.layout.fragment_encrypt2, container, false);
    

以下是我定义 EditText 字段的 XML 文件中的 sn-p。我需要 EditText 是多行的。

<EditText
            android:id="@+id/textField"
            android:layout_
            android:layout_
            android:hint="@string/Encrypted_Text_Hint"
            android:gravity="top"
            android:inputType="textMultiLine"
            android:imeOptions="actionDone"/>

【问题讨论】:

你没有在EditText上设置任何imeOptions,在这种情况下return被认为是另一个输入字符。 我已经设置了imeOptions,但是我需要EditText是多行的 【参考方案1】:

如果您不想要多行,则可以为您 edittext 指定单行。对于edittext,您也可以像这样将imeOptions设置为Done:

<EditText 
   android:id="@+id/edittext_done"
   android:layout_
   android:layout_
   android:imeOptions="actionDone"
   android:singleLine="true"
   />

我显然不知道你是否正在努力实现这一目标。任何方式看看。

编辑: android:singleLine 自 API 3 以来由于性能不佳而被弃用,您必须改用 android:maxLines。 singleLine 将可用,因为即使是现在,android:maxLines 属性也不支持某些效果。

【讨论】:

删除最后一个属性'singleLine',然后运行它 我设置为多行 Multiline 和 android:imeOptions="actionDone" 似乎不能同时工作【参考方案2】:

我通过更改 XML 文件中的以下内容解决了这个问题:

 android:inputType="textMultiLine"

到:

 android:inputType="textImeMultiLine"

【讨论】:

关闭!这会将焦点移至布局中的下一项,但不会关闭软键盘。【参考方案3】:

下面的代码对我有用。

在 XML 中:

    android:imeOptions="actionDone"
    android:inputType="textCapWords"

在 JAVA 类中:

    edit_text.setOnEditorActionListener(new OnEditorActionListener() 

                @Override
                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
                    // TODO Auto-generated method stub

                    if ((actionId==EditorInfo.IME_ACTION_DONE )   )
                        
                        //Toast.makeText(getActivity(), "call",45).show();
                       // hide virtual keyboard
                       InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);

                       //or try following:
                       //InputMethodManager imm = (InputMethodManager)getBaseContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                       imm.hideSoftInputFromWindow(auto_data.getWindowToken(), 0);
                       return true;
                    
                    return false;

                
            );

【讨论】:

【参考方案4】:

根据我的测试,当用户单击回车按钮时,关闭软键盘真正需要什么,只需将以下代码添加到 xml 中的 EditText 即可实现。

android:imeOptions="actionDone"
android:inputType="textImeMultiLine"

不需要 OnEditorActionListener 或任何其他 Java 代码。

【讨论】:

【参考方案5】:

已接受的答案已弃用:

<EditText 
   android:id="@+id/edittext_done"
   android:layout_
   android:layout_
   android:imeOptions="actionDone"
   android:singleLine="true"
/>

试试这个:

<EditText 
   android:id="@+id/edittext_done"
   android:layout_
   android:layout_
   android:imeOptions="actionDone"
   android:maxLines="1"
/>

【讨论】:

【参考方案6】:

EditText.xml

<EditText
        android:id="@+id/edit_text_searh_home"
        android:layout_
        android:layout_
        android:padding="4dp"
        android:singleLine="true"
        android:lines="1"
        android:hint="Ingresa palabras claves"
        android:imeActionLabel="Search"
        android:background="@drawable/rounded_edit_text_search"
        android:drawableRight="@android:drawable/ic_menu_search"/>

片段.java

final EditText edit_text_searh = (EditText) v.findViewById(R.id.edit_text_searh_home);

    edit_text_searh.setOnEditorActionListener(new TextView.OnEditorActionListener() 
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(edit_text_searh.getWindowToken(), 0);

            Toast.makeText(getContext(),edit_text_searh.getText(),Toast.LENGTH_SHORT).show();
            return true;

        
    );

【讨论】:

【参考方案7】:

这可能是你可以像这样向你的 EditText 添加一个属性:

android:imeOptions="actionSearch"

【讨论】:

即使有这个选项,仍然没有调用 actionListener【参考方案8】:

试试这个方法,或许能解决你的问题。

protected void showKeyboard() 

            InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
            if (activity.getCurrentFocus() == null) 
                inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
             else 
                View view = activity.getCurrentFocus();
                inputMethodManager.showSoftInput(view,InputMethodManager.SHOW_FORCED);
            
        

        /**
         * Hide keyboard.
         */
        protected void hideKeyboard() 

            InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
            View view = activity.getCurrentFocus();
            if (view == null) 
                if (inputMethodManager.isAcceptingText())
                    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
             else 
                if (view instanceof EditText)
                    ((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
                inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                      
        

【讨论】:

问题是actionListener没有被调用,所以我什至不能调用这些方法【参考方案9】:

这对我有用。基于这个布局xml:

<com.google.android.material.textfield.TextInputLayout
    android:layout_
    android:layout_>

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/ip_override_text_input_sat"
        android:layout_
        android:layout_
        android:layout_gravity="end"
        android:hint="IP Address" />
</com.google.android.material.textfield.TextInputLayout>

我需要这样做以使键盘关闭,文本输入以失去焦点并隐藏光标。

findViewById<TextView>(R.id.ip_override_text_input_sat).setOnKeyListener  v, keyCode, event ->
            if (keyCode == KeyEvent.KEYCODE_ENTER && currentFocus != null) 
                val inputManager =
                    getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                inputManager.hideSoftInputFromWindow(
                    this.currentFocus!!.windowToken,
                    HIDE_NOT_ALWAYS
                )
                currentFocus!!.clearFocus()
                return@setOnKeyListener true
            
            return@setOnKeyListener false
        

希望这有助于有人做同样的事情

【讨论】:

以上是关于按下返回键时隐藏软键盘的主要内容,如果未能解决你的问题,请参考以下文章

android:按下完成键时软键盘执行动作

android中如何点击一个按钮时隐藏软键盘,(不是点击空白处隐藏软键盘)

即使使用输入管理器也无法隐藏 Android 软键盘

java 手机软键盘相关,判断软键盘状态,显示软键盘,隐藏软键盘

IOS隐藏软键盘的几种方式

android软键盘挡住了下面的按钮,有啥办法解决么