2012-05-11 71 views
5

我想知道在將文本輸入到EditText後隱藏鍵盤的最佳方法。在Android中隱藏鍵盤的最佳方法

1)setonfocuschangelistener:只有按下done按鈕或焦點從一個EditText變爲另一個時,此偵聽器纔會被觸發嗎?當我使用這種方法時,我無法隱藏鍵盤。

2)setOnTouchListener:當我使用這個,我可以隱藏鍵盤,但我懷疑這可能是一個問題。在這種情況下,我將觸控偵聽器添加到根LinearLayout。我使用過的代碼如下:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.login); 

    txtUserName = (EditText)findViewById(R.id.txtUserName); 
    btnLogin = (Button)findViewById(R.id.btnLogin); 
    layoutView = (LinearLayout)findViewById(R.id.li); 

    layoutView.setOnTouchListener(new OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
      inputManager.hideSoftInputFromWindow(txtUserName 
        .getWindowToken(), 0); 
      return true; 
     } 
    }); 
} 

在主LinearLayout中,我使用了其他兩個LinearLayout。我遇到上述代碼的問題是,當我按下某些時候,鍵盤不會隱藏。 我的疑惑是,我只在根佈局中添加touch偵聽器,沒有爲其他內部佈局或其他控件(TextView)提供觸摸偵聽器。當我觸摸其他控件或TextView周圍的某些點時(即內部佈局),鍵盤不會隱藏。

這意味着我需要將touchListener添加到根佈局內的所有佈局或控件? 如何以更好的方式處理這種情況?

+0

謝謝朋友的回覆。我們可以使用上面的代碼來隱藏鍵盤。我做的錯誤是將觸摸偵聽器添加到根佈局,而不是將觸摸偵聽器添加到內部佈局中。因此,我希望當觸摸EditText之外時,這也是隱藏鍵盤的最佳方法。再次感謝所有人的回覆。因此,如果任何用戶有權將此標記爲正確答案,請執行此操作。只有在驗證了代碼之後。 –

回答

5

試試這個:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

可以用來抑制鍵盤,直到用戶實際觸及的EditText視圖。

OR

inputManager.hideSoftInputFromWindow(editView.getWindowToken(), 0); 
+0

我以前也嘗試過這個。但它沒有奏效。我的疑問是,是否需要將其他代碼與代碼片段一起添加?如果您提供關於它如何工作而不是一行代碼的小解釋,會更好。 –

+0

試試這個,我會解釋你 –

+0

哇,對我很好, – umesh

14

您可以使用此代碼

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

如果沒有顯示鍵盤,這個會導致空指針異常。請爲 –

+1

@AjithMemana添加一個修復程序,實際上它不會給我任何例外,我已經嘗試過,也看到了文檔。謝謝 –

+0

@Waseem請把你的鏈接添加到文檔 –

9

我對這個問題的回答:

添加這個方法:

public static void hideSoftKeyboard(Activity activity) { 
    InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); 
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); 
} 

如果您希望在觸摸屏隱藏鍵盤,你可以這樣做:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
hideSoftKeyboard(LoginActivity.this); 
return false; 
} 

希望這會幫助你。

-1

隱藏鍵盤的最佳方法,只需在您的活動中使用dispatchDoneKey即可。如果鍵盤處於可見狀態,它將被隱藏。

public void dispatchDoneKey() { 
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); 
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); 
} 
2

的try-catch一個簡單的檢查避免了NullPointerException,如果沒有視圖集中。

public void hideKeyboard(Activity activity) { 
    InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); 
     if (activity.getCurrentFocus() != null) { 
      inputManager.hideSoftInputFromWindow(activity.getCurrentFocus() 
        .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
     } 
}