調用 editText.requestFocus() 和 editText.performClick() 後,EditText 雖獲取焦點但軟鍵盤 (IME) 不彈出。原因是 performClick() 僅觸發點擊事件,不直接請求輸入法顯示。
Button btn = findViewById(R.id.btn);
final EditText editText = findViewById(R.id.edit_text);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 1. 請求焦點(必要前提)
editText.requestFocus();
// 2. 顯示軟鍵盤
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
});
| 標誌位 | 含義 |
|---|---|
| SHOW_IMPLICIT | 隱式顯示,系統決定是否顯示(推薦,尊重用戶設置) |
| SHOW_FORCED | 強制顯示,忽略用戶偏好(慎用,可能惡化體驗) |
public static void showKeyboard(Activity activity, EditText editText) {
if (activity == null || editText == null) return;
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}
public static void hideKeyboard(Activity activity, View view) {
if (activity == null || view == null) return;
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
在清單文件 Activity 標籤設置:
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateVisible|adjustResize" >
</activity>
或佈局中 EditText 設置:
<EditText
android:id="@+id/edit_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:inputType="text" />
並在 onResume 中調用 showKeyboard(this, editText) 實現頁面進入自動彈出。
getSystemService 傳錯參數:必須用 Context.INPUT_METHOD_SERVICE 字符串常量。focusable="true" 和 focusableInTouchMode="true"(XML 默認 true,代碼創建需顯式設置)。onCreate 中調用:視圖未附加到窗口,getWindowToken() 為 null。應在 onResume、onWindowFocusChanged(true) 或按鈕點擊中調用。requestFocus() 目標明確。
// 顯示
editText.requestFocus();
WindowInsetsController controller = getWindow().getInsetsController();
if (controller != null) {
controller.show(WindowInsets.Type.ime());
}
// 隱藏
if (controller != null) {
controller.hide(WindowInsets.Type.ime());
}