Bàn phím Android bị loại bỏ


147

Làm cách nào để tắt bàn phím khi nhấn nút?


Tạo một EditText Focusable = Sai thực hiện công việc. Bạn có muốn vô hiệu hóa nó hoàn toàn?
st0le

Câu trả lời:


325

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);

1
Hai vấn đề với điều này .... một là myEditText cần phải là Final. Thứ hai là tôi phải biết hộp EditText nào có trọng tâm. Bất kỳ giải pháp cho điều này?
Ethan Allen

78
Đối với bất kỳ ai khác vấp ngã ở đây, bạn có thể sử dụng hoạt động (hoạt động bạn đang ở hoặc các đoạn 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.
Drake Clarris

2
Câu trả lời này, kết hợp với nhận xét ở đây, đã giải quyết hoàn toàn vấn đề của tôi!
aveschini

9
Thật là một cách tiếp cận xấu xí, xấu xí để loại bỏ một bàn phím. Tôi hy vọng có một cách sạch hơn trong tương lai để làm một việc đơn giản như vậy.
Subby

73

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);
    }
}

3
isAcceptingText()làm cho câu trả lời này tốt hơn những câu trả lời khác
user1506104

Giải pháp tốt ... trong một số trường hợp hiếm hoi, isAcceptingText () có thể trả về false khi bàn phím vẫn còn trên màn hình, ví dụ nhấp từ EditText sang văn bản có thể được chọn nhưng không được chỉnh sửa trong cùng một cửa sổ.
Georgie

29

Đâ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);
    }
}

Đó là nếu bạn biết chế độ xem đã khiến bàn phím hiển thị.
RPM

16

bạn cũng có thể sử dụng mã này vào sự kiện nhấn nút

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

13

Đâ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()

5

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);

3
Chào mừng bạn đến với Stack Overflow! Đây thực sự là một bình luận, không phải là một câu trả lời. Với một chút đại diện, bạn sẽ có thể gửi bình luận .
Jack

4
    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();
    }
}

1

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)
    }
}


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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.