Làm cách nào để tắt bàn phím khi nhấn nút?
Làm cách nào để tắt bàn phím khi nhấn nút?
Câu trả lời:
Bạn muốn vô hiệu hóa hoặc loại bỏ một Bàn phím ảo?
Nếu bạn muốn loại bỏ nó, bạn có thể sử dụng các dòng mã sau trong nút của mình khi nhấp vào Sự kiện
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
getActivity()) getCurrentFocus().getWindowToken()cho lần đầu tiên tranh luận hideSoftInputFromWindow(). Ngoài ra, làm điều đó trong onPause()và không phải onStop()nếu bạn đang cố gắng làm cho nó biến mất khi thay đổi hoạt động.
Giải pháp ở trên không hoạt động đối với tất cả các thiết bị và hơn nữa, nó sử dụng EditText làm tham số. Đây là giải pháp của tôi, chỉ cần gọi phương pháp đơn giản này:
private void hideSoftKeyBoard() {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if(imm.isAcceptingText()) { // verify if the soft keyboard is open
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
isAcceptingText()làm cho câu trả lời này tốt hơn những câu trả lời khác
Đây là giải pháp của tôi
public static void hideKeyboard(Activity activity) {
View v = activity.getWindow().getCurrentFocus();
if (v != null) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
Đây là một giải pháp Kotlin (trộn các câu trả lời khác nhau trong chuỗi)
Tạo một hàm mở rộng (có lẽ trong một lớp ViewHelpers chung)
fun Activity.dismissKeyboard() {
val inputMethodManager = getSystemService( Context.INPUT_METHOD_SERVICE ) as InputMethodManager
if( inputMethodManager.isAcceptingText )
inputMethodManager.hideSoftInputFromWindow( this.currentFocus.windowToken, /*flags:*/ 0)
}
Sau đó, chỉ cần tiêu thụ bằng cách sử dụng:
// from activity
this.dismissKeyboard()
// from fragment
activity.dismissKeyboard()
Giải pháp đầu tiên với InputMethodManager hoạt động giống như một nhà vô địch đối với tôi, phương thức getWindow (). SetSoftInputMode không có trên Android 4.0.3 HTC Amaze.
@Ethan Allen, tôi không cần phải chỉnh sửa văn bản cuối cùng. Có lẽ bạn đang sử dụng một lớp bên trong EditText mà bạn đã khai báo phương thức chứa? Bạn có thể biến EditText thành một biến lớp của Activity. Hoặc chỉ cần khai báo một EditText mới bên trong lớp / phương thức bên trong và sử dụng findViewById () một lần nữa. Ngoài ra, tôi không thấy rằng tôi cần phải biết EditText nào trong biểu mẫu có trọng tâm. Tôi chỉ có thể chọn một cách tùy tiện và sử dụng nó. Thích như vậy:
EditText myEditText= (EditText) findViewById(R.id.anyEditTextInForm);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
public static void hideSoftInput(Activity activity) {
try {
if (activity == null || activity.isFinishing()) return;
Window window = activity.getWindow();
if (window == null) return;
View view = window.getCurrentFocus();
//give decorView a chance
if (view == null) view = window.getDecorView();
if (view == null) return;
InputMethodManager imm = (InputMethodManager) activity.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm == null || !imm.isActive()) return;
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
} catch (Throwable e) {
e.printStackTrace();
}
}
Giải pháp này đảm bảo rằng nó ẩn bàn phím cũng không làm gì nếu không mở. Nó sử dụng phần mở rộng để có thể được sử dụng từ bất kỳ lớp Chủ sở hữu bối cảnh nào.
fun Context.dismissKeyboard() {
val imm by lazy { this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager }
val windowHeightMethod = InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
val height = windowHeightMethod.invoke(imm) as Int
if (height > 0) {
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
}
}
Bằng cách sử dụng bối cảnh của chế độ xem, chúng ta có thể đạt được kết quả mong muốn với các phương thức mở rộng sau trong Kotlin:
/**
* Get the [InputMethodManager] using some [Context].
*/
fun Context.getInputMethodManager(): InputMethodManager {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return getSystemService(InputMethodManager::class.java)
}
return getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
}
/**
* Dismiss soft input (keyboard) from the window using a [View] context.
*/
fun View.dismissKeyboard() = context
.getInputMethodManager()
.hideSoftInputFromWindow(
windowToken
, 0
)
Một khi những điều này được đặt ra, chỉ cần gọi:
editTextFoo.dismiss()