software - 關閉/隱藏Android軟鍵盤
inputmethodmanager (20)
我的佈局中有一個EditText
和一個Button
。
在編輯字段中寫入並單擊Button
,我想隱藏虛擬鍵盤。 我假設這是一段簡單的代碼,但我在哪裡可以找到它的一個例子?
簡短的回答
在OnClick
偵聽onEditorAction
中,使用IME_ACTION_DONE
調用EditText
的IME_ACTION_DONE
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
}
});
深入研究
我覺得這種方法更好,更簡單,更符合Android的設計模式。 在上面的簡單示例中(通常在大多數常見情況下),您將擁有一個具有焦點的EditText
,它通常也是首先調用鍵盤的鍵盤(它肯定能夠調用它)許多常見情況)。 以同樣的方式, 它應該是釋放鍵盤的那個,通常可以通過ImeAction
來完成。 只要看看帶有android:imeOptions="actionDone"
的EditText
如何表現,你想用同樣的方法實現相同的行為。
檢查這個相關的答案
Meier的解決方案也適用於我。 在我的情況下,我的應用程序的頂級是tabHost,我想在切換標籤時隱藏關鍵字 - 我從tabHost視圖中獲取窗口標記。
tabHost.setOnTabChangedListener(new OnTabChangeListener() {
public void onTabChanged(String tabId) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
}
}
以下是你在Mono for Android(AKA MonoDroid)中的表現
InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);
到目前為止, Saurabh Pareek有最好的答案。
不過,不妨使用正確的旗幟。
/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
實際使用的例子
/* click button */
public void onClick(View view) {
/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
/* start loader to check parameters ... */
}
/* loader finished */
public void onLoadFinished(Loader<Object> loader, Object data) {
/* parameters not valid ... */
/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
/* parameters valid ... */
}
如果要在單元或功能測試期間關閉軟鍵盤,可以通過單擊測試中的“後退按鈕”來執行此操作:
// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
我把“後退按鈕”放在引號中,因為上面沒有觸發有onBackPressed()
問題的Activity。它只是關閉鍵盤。
確保在繼續之前暫停一段時間,因為關閉後退按鈕需要一點時間,因此後續點擊視圖等將在短暫停頓後暫停(1秒足夠長時間) )。
如果這裡的所有其他答案對您不起作用,那麼還有另一種手動控制鍵盤的方法。
用它來創建一個函數來管理一些EditText
的屬性:
public void setEditTextFocus(boolean isFocused) {
searchEditText.setCursorVisible(isFocused);
searchEditText.setFocusable(isFocused);
searchEditText.setFocusableInTouchMode(isFocused);
if (isFocused) {
searchEditText.requestFocus();
}
}
然後,確保您打開/關閉鍵盤的EditText
onFocus:
searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (v == searchEditText) {
if (hasFocus) {
// Open keyboard
((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
} else {
// Close keyboard
((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
}
}
}
});
現在,每當你想手動打開鍵盤時調用:
setEditTextFocus(true);
關閉電話:
setEditTextFocus(false);
您可以使用InputMethodManager強制Android隱藏虛擬鍵盤,調用hideSoftInputFromWindow
,傳入包含焦點視圖的窗口的標記。
// 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);
}
這將強制鍵盤在所有情況下都被隱藏。 在某些情況下,您需要傳入InputMethodManager.HIDE_IMPLICIT_ONLY
作為第二個參數,以確保在用戶未明確強制顯示鍵盤時(僅通過按住菜單)隱藏鍵盤。
注意:如果要在Kotlin中執行此操作,請使用: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
我幾乎已經嘗試了所有這些答案,我有一些隨機問題,尤其是三星Galaxy s5。
我最終得到的是強制展示和隱藏,它完美地運作:
/**
* Force show softKeyboard.
*/
public static void forceShow(@NonNull Context context) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}
/**
* Force hide softKeyboard.
*/
public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) {
if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) {
editText.requestFocus();
}
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
我花了兩天多的時間來處理帖子中發布的所有解決方案,並發現它們缺乏這種或那種方式。 我的確切要求是有一個100%可靠性的按鈕顯示或隱藏屏幕鍵盤。 當鍵盤處於隱藏狀態時,無論用戶點擊什麼輸入字段,都不應重新出現。 當它處於可見狀態時,無論用戶點擊什麼按鈕,鍵盤都不會消失。 這需要在Android 2.2+上運行,直到最新的設備。
你可以在我的app clean RPN中看到這個的有效實現。
在許多不同的手機(包括froyo和薑餅設備)上測試了許多建議的答案後,很明顯Android應用程序可以可靠地:
- 暫時隱藏鍵盤。 當用戶聚焦新文本字段時,它將再次重新出現。
- 在活動開始時顯示鍵盤,並在活動上設置一個標誌,指示鍵盤應始終可見。 只有在活動初始化時才能設置此標誌。
- 將活動標記為從不顯示或允許使用鍵盤。 只有在活動初始化時才能設置此標誌。
對我來說,暫時隱藏鍵盤是不夠的。 在某些設備上,只要新的文本字段被聚焦,它就會重新出現。 由於我的應用程序在一個頁面上使用多個文本字段,因此聚焦新文本字段將導致隱藏鍵盤再次彈回。
不幸的是,列表中的第2項和第3項僅在啟動活動時才具有可靠性。活動變得可見後,您無法永久隱藏或顯示鍵盤。訣竅是當用戶按下鍵盤切換按鈕時實際重啟您的活動。在我的應用程序中,當用戶按下切換鍵盤按鈕時,運行以下代碼:
private void toggleKeyboard(){
if(keypadPager.getVisibility() == View.VISIBLE){
Intent i = new Intent(this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
Bundle state = new Bundle();
onSaveInstanceState(state);
state.putBoolean(SHOW_KEYBOARD, true);
i.putExtras(state);
startActivity(i);
}
else{
Intent i = new Intent(this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
Bundle state = new Bundle();
onSaveInstanceState(state);
state.putBoolean(SHOW_KEYBOARD, false);
i.putExtras(state);
startActivity(i);
}
}
這會導致當前活動將其狀態保存到Bundle中,然後啟動活動,通過布爾值來指示是否應顯示或隱藏鍵盤。
在onCreate方法中,運行以下代碼:
if(bundle.getBoolean(SHOW_KEYBOARD)){
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}
如果應該顯示軟鍵盤,則告訴InputMethodManager顯示鍵盤,並指示窗口使軟輸入始終可見。如果應隱藏軟鍵盤,則設置WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM。
這種方法可以在我測試過的所有設備上可靠運行 - 從運行Android 2.2的4歲HTC手機到運行4.2.2的nexus 7。這種方法的唯一缺點是你需要小心處理後退按鈕。由於我的應用程序基本上只有一個屏幕(它是一個計算器),我可以覆蓋onBackPressed()並返回到設備主屏幕。
我還有一個隱藏鍵盤的解決方案:
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
這裡在HIDE_IMPLICIT_ONLY
的位置傳遞HIDE_IMPLICIT_ONLY
,在HIDE_IMPLICIT_ONLY
的位置showFlag
0
。 它會強行關閉軟鍵盤。
用這個
this.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
請在onCreate()
嘗試以下代碼
EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);
這應該工作:
public class KeyBoard {
public static void show(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
}
public static void hide(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
}
public static void toggle(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm.isActive()){
hide(activity);
} else {
show(activity);
}
}
}
KeyBoard.toggle(activity);
隱藏軟鍵盤也很有用:
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
這可用於在用戶實際觸摸editText視圖之前抑制軟鍵盤。
在某些情況下,除其他所有方法外,此方法都可以使用 這節省了我的一天:)
public static void hideSoftKeyboard(Activity activity) {
if (activity != null) {
InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (activity.getCurrentFocus() != null && inputManager != null) {
inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
inputManager.hideSoftInputFromInputMethod(activity.getCurrentFocus().getWindowToken(), 0);
}
}
}
public static void hideSoftKeyboard(View view) {
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputManager != null) {
inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}
對於我的情況,我在操作欄中使用了SearchView。用戶執行搜索後,鍵盤將再次彈出。
使用InputMethodManager沒有關閉鍵盤。我不得不clearFocus並將搜索視圖的焦點設置為false:
mSearchView.clearFocus();
mSearchView.setFocusable(false);
我有這種情況,我的EditText
位置也可以在一個AlertDialog
,所以鍵盤應該關閉解僱。以下代碼似乎在任何地方都可以使用:
public static void hideKeyboard( Activity activity ) {
InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE );
View f = activity.getCurrentFocus();
if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) )
imm.hideSoftInputFromWindow( f.getWindowToken(), 0 );
else
activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );
}
或者到這一切它的解決方案,如果你想關閉軟鍵盤從任何地方,而不必是用於打開鍵盤(EditText上)字段的引用,但仍然希望這樣做,如果該領域的重點,你可以使用這(來自一項活動):
if (getCurrentFocus() != null) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
簡單易用的方法,只需調用hideKeyboardFrom(YourActivity.this); 隱藏鍵盤
/**
* This method is used to hide keyboard
* @param activity
*/
public static void hideKeyboardFrom(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
protected void hideSoftKeyboard(EditText input) {
input.setInputType(0);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
}