2010-04-18 112 views
11

的一个重写的“完成”按键我用了一下Android的代码重写我的EditText领域的“完成”按钮:安卓:隐藏键盘的EditText

myEditField.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if (actionId == EditorInfo.IME_ACTION_DONE) { 

       mySubroutine(); 

       return true; 
      } 
      return false; 
     } 
    }); 

激活现场调出键盘,然后按“完成”即可成功评估mySubroutine()。但是,当按“完成”时键盘不再消失。如何将此默认行为恢复到例程?

回答

43

为什么不:

myEditField.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if (actionId == EditorInfo.IME_ACTION_DONE) { 

      mySubroutine(); 
     } 
     return false; 
    } 
}); 

你处理你的代码后,就返回false。这可以解释为无论你的代码(mySubroutine())是什么,它仍然会使用默认的动作。如果你返回“true”,你告诉你是一个快乐的编码器,并且需要完成的所有事情都发生在你的mySubroutine()中,并且默认的动作不需要采取行动。

+0

这是正确的方式,否则你将会反对框架的设计。我已经详细阐述了在相关问题中的_way-the-top_答案[这里](http://stackoverflow.com/a/25119481/2837443) – 2014-08-04 13:14:03

+0

我四年没有碰过Android代码,所以我会听取你的意见。 – 2015-01-19 11:09:11

12

您可以通过执行关闭键盘:

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

我使用Eclipse和我得到两个以下错误: “InputMethodManager不能被解析为一个类型” 和 “的方法getWindowToken( )是未定义的类型新TextView.onEditorActionListener(){}“ 我不是一个Java程序员太多,所以我不知道如何解释这些。我是否需要提前包含某些内容? – 2010-04-18 19:15:20

+0

尝试按Ctrl + Shift + o进行相应的导入。 – Macarse 2010-04-18 20:15:01

+5

谢谢,我需要一个依赖项。 我还必须用v.getWindowToken()替换getWindowToken(),否则它会很好,谢谢!现在我只需要了解它做了什么 – 2010-04-18 23:00:25

7

您必须附加一个onClickListener到执行以下代码按钮:

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

无法读取的答案 – AlexVogel 2011-07-04 14:28:41

+0

它对我有效 – SolArabehety 2012-08-01 15:42:26

0

我有同样的问题。在editText VISIBILITY从GONE改变为VISIBLE之后,我不得不设置焦点并显示软键盘。我实现了这个使用下面的代码:

 (new Handler()).postDelayed(new Runnable() { 

     public void run() {    yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0)); 
      yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));      

     } 
    }, 200);