按下按钮时关闭虚拟键盘


133

我有一个ActivityEditText,一个按钮和一个ListView。目的是在中键入搜索屏幕EditText,按按钮,并使搜索结果填充此列表。

一切运行正常,但是虚拟键盘的行为很奇怪。

如果单击EditText,我将得到虚拟键盘。如果我单击虚拟键盘上的“完成”按钮,它将消失。但是,如果在单击虚拟键盘上的“完成”之前单击搜索按钮,则虚拟键盘会停留并且无法摆脱它。单击“完成”按钮不会关闭键盘。它将“完成”按钮从“完成”更改为箭头,并保持可见状态。

谢谢你的帮助

Answers:


304
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                     InputMethodManager.HIDE_NOT_ALWAYS);

我在onClick(View v)活动结束后说了这一点。

您需要导入android.view.inputmethod.InputMethodManager

单击按钮时,键盘隐藏。


55
注意:(如果您想在可能没有焦点的情况下使用此方法(例如onPause()等): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Peter Ajtai 2012年

5
您还必须导入上下文。
2013年

4
注意:如果键盘已经隐藏,则抛出NPE。按照彼得的评论避免这种情况。
Don Larynx

为什么单击不相关的按钮后出现键盘?有人可以提供一些解释或链接吗?
kommradHomer

1
作品魅力十足!
ARiF

59
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(), 
                                      InputMethodManager.RESULT_UNCHANGED_SHOWN);
            return true;
        }
        return false;
    }
});

这个对我有用。谢谢!
阿曼·戈亚尔

29

使用以下代码

your_button_id.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        try  {
            InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {

        }
    }
});

2
认真地捕获异常而不是简单的空检查?
Glass博士

为我工作,在按钮单击上隐藏键盘
ashishdhiman2007

我所需的简单解决方案:单击搜索按钮后隐藏键盘。
dawoodman71 '17

13

您应该OnEditorActionListener为您的EditView 实施

public void performClickOnDone(EditView editView, final View button){
    textView.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
            hideKeyboard();
            button.requestFocus();
            button.performClick();
            return true;
        }
    });

您可以通过以下方式隐藏键盘:

public void hideKeybord(View view) {
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
                                  InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

您还应该使用以下命令触发键盘隐藏在按钮中 onClickListener

现在,在虚拟键盘和按钮上单击“完成”将执行相同操作-隐藏键盘并执行单击操作。


太好了,但我不太关注。我认为该帖子吃了一些代码(示例中的“ public void”之后没有任何内容)。我尝试在我的Activity的onCreate方法中设置setOnEditorActionListner,但它不知道setOnEditorActionListener是什么。我收到“匿名内部类型”通知。(我正在我的Activity onCreate方法中执行此操作) i37.tinypic.com/6ozkig.png
Andrew

1
看起来这段代码有几个错误,但这是正确的主意。一方面,OnEditorActionListener接口是一个内部类,所以您需要显式导入它(在这种情况下,Eclipse不会为您完成)或将其引用为TextView.OnEditorActionListener
MatrixFrog

我有点麻烦。我已经实现了onEditorActionListener(公共类SearchActivity扩展了ListActivity实现了OnClickListener,OnEditorActionListener),我已经将侦听器附加到了EditText(mSearchText.setOnEditorActionListener(this);),但是Eclipse不允许我覆盖onEditorAction处理程序(公共boolean onEditorAction (TextView v,int actionId,KeyEvent事件)。它说它必须重写一个超类方法。有任何想法吗?
安德鲁

嗨,您可以通过键入yourEditView.setOnEditorActionListener(new OnEditorActionListener(){....
pixel

11

在您的按钮单击事件中添加以下代码:

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

1
像魅力一样工作!
coderpc '17

10

由于您只有一个编辑文本,因此只需在按钮单击内为该编辑文本进行调用操作,其余操作即可由系统处理。如果您拥有多个编辑文本,那么效果将不那么理想,因为您必须先获取焦点突出的编辑文本。但在您的情况下,它将完美地工作

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
您能否解释一下为什么您的解决方案有效,以便其他人可以理解并从中学习?谢谢!
肖恩

当然肖恩。我刚刚编辑了顶部,因为如果不清楚,我将立即开始摆姿势,请告诉我,我将使用按钮onclick进行扩展
Laert

相信我,这是最优雅的方法之一。感谢@Laert
WitVault

9

对于活动,

InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

对于片段,请使用getActivity()

getActivity()。getSystemService();

getActivity()。getCurrentFocus();

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);

7

该解决方案最适合我:

private void showKeyboard(EditText editText) {
    editText.requestFocus();
    editText.setFocusableInTouchMode(true);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    editText.setSelection(editText.getText().length());
}

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

3

试试这个...

  1. 用于显示键盘

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  2. 用于隐藏键盘

    InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

“用于隐藏键盘”方法是一个图钉(隐藏是否可见,显示是否隐藏)而不是隐藏,
Ninja Coding

1
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}

嗨!尽管此答案可能足以满足@Andrew的需求,但如果可以通过一些解释进行扩展,以确保将来的读者可以从中受益最大,那就太好了!
derM

1

Kotlin示例:

val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

来自片段:

inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

来自活动:

inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

0

您在按钮单击事件中使用此代码

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

0

崩溃Null Point异常修复:我遇到了一种情况,当用户单击按钮时键盘可能无法打开。您必须编写一条if语句来检查getCurrentFocus()是否为null:

            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

-2

如果设置android:singleLine="true",按钮会自动隐藏键盘¡

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.