2010-04-18 107 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);