Đóng bàn phím ảo khi nhấn nút


133

Tôi có một Activityvới một EditText, một nút và một ListView. Mục đích là để nhập một màn hình tìm kiếm vào EditText, nhấn nút và để kết quả tìm kiếm điền vào danh sách này.

Đây là tất cả hoạt động hoàn hảo, nhưng bàn phím ảo đang hành xử lạ.

Nếu tôi nhấp vào EditText, tôi nhận được bàn phím ảo. Nếu tôi nhấp vào nút "Xong" trên bàn phím ảo, nó sẽ biến mất. Tuy nhiên, nếu tôi nhấp vào nút tìm kiếm của mình trước khi nhấp vào "Xong" trên bàn phím ảo, bàn phím ảo sẽ ở lại và tôi không thể thoát khỏi nó. Nhấp vào nút "Xong" không đóng bàn phím. Nó thay đổi nút "Xong" từ "Xong" thành một mũi tên và vẫn hiển thị.

Cảm ơn bạn đã giúp đỡ

Câu trả lời:


304
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                     InputMethodManager.HIDE_NOT_ALWAYS);

Tôi đặt điều này ngay sau onClick(View v)sự kiện.

Bạn cần nhập android.view.inputmethod.InputMethodManager;

Bàn phím ẩn khi bạn nhấp vào nút.


55
Lưu ý: (trong trường hợp bạn muốn sử dụng phương pháp này trong trường hợp có thể không tập trung (ví dụ: onPause (), v.v.): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Peter Ajtai

5
Bạn cũng phải nhập Ngữ cảnh.
Si8

4
THẬN TRỌNG: Ném NPE nếu bàn phím đã bị ẩn. Theo dõi bình luận của Peter để tránh điều này.
Don Larynx

Tại sao bàn phím hiển thị sau khi nhấp vào nút không liên quan? ai đó có thể cung cấp một số lời giải thích hoặc một liên kết?
kommradHome

1
Hoạt động như quyến rũ!
ARiF

59
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(), 
                                      InputMethodManager.RESULT_UNCHANGED_SHOWN);
            return true;
        }
        return false;
    }
});

Nó làm việc cho tôi. Cảm ơn!
Aman Goyalty

29

Sử dụng mã dưới đây

your_button_id.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        try  {
            InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {

        }
    }
});

2
Bắt ngoại lệ thay vì kiểm tra null đơn giản, nghiêm túc?!
Dr Glass

Làm việc cho tôi, ẩn bàn phím khi nhấp vào nút
ashishdhiman2007 18/03/17

giải pháp đơn giản cho những gì tôi cần: ẩn bàn phím sau khi nhấp vào nút tìm kiếm.
dawoodman71

13

Bạn nên triển khai OnEditorActionListenercho EditView của mình

public void performClickOnDone(EditView editView, final View button){
    textView.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
            hideKeyboard();
            button.requestFocus();
            button.performClick();
            return true;
        }
    });

Và bạn ẩn bàn phím bằng cách:

public void hideKeybord(View view) {
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
                                  InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

Bạn cũng nên bắn bàn phím ẩn trong nút bằng cách sử dụng onClickListener

Bây giờ, nhấp vào 'Xong' trên bàn phím ảo và nút sẽ làm tương tự - ẩn bàn phím và thực hiện hành động nhấp.


Tuyệt vời, nhưng tôi không hoàn toàn theo dõi. Tôi nghĩ rằng bài đăng đã ăn một số mã (không có gì sau "khoảng trống công khai" trong mẫu của bạn). Tôi đã cố gắng thiết lập OnEditorActionListner trong phương thức onCreate của Activity, nhưng không biết setOnEditorActionListener là gì. Tôi nhận được thông báo "Loại bên trong ẩn danh". (Tôi đang làm điều này trong phương thức Activity onCreate của mình) i37.tinypic.com/6ozkig.png
Andrew

1
Có vẻ như có một vài lỗi trong mã này, nhưng đó là ý tưởng đúng. Đối với một điều, giao diện OnEditorActionListener là một lớp bên trong, vì vậy bạn cần nhập nó một cách rõ ràng (Eclipse sẽ không làm điều đó cho bạn trong trường hợp này) hoặc gọi nó là TextView.OnEditorActionListener.
MatrixFrog

Tôi có một chút rắc rối. Tôi đã triển khai onEditorActionListener (lớp công khai SearchActivity mở rộng ListActivity thực hiện OnClickListener, OnEditorActionListener), tôi đã đính kèm một trình lắng nghe vào EditText của mình (mSearchText.setOnEditorActionListener (this);), nhưng Eclipse không cho phép tôi xử lý (TextView v, int actionId, sự kiện KeyEvent)). Nó nói rằng nó phải ghi đè một phương thức siêu lớp. Có ý kiến ​​gì không?
Andrew

Xin chào, bạn có thể nội tuyến OnEditorActionListener của mình bằng cách nhập yourEditView.setOnEditorActionListener (new OnEditorActionListener () {....
pixel

11

Thêm mã sau đây vào sự kiện nhấn nút của bạn:

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

1
Hoạt động như quyến rũ!
coderpc

10

Vì bạn chỉ có một văn bản chỉnh sửa, sau đó chỉ cần gọi hành động được thực hiện cho văn bản chỉnh sửa đó bên trong nút bấm của bạn và phần còn lại được hệ thống xử lý. Nếu bạn có nhiều hơn một edittext thì điều này sẽ không hiệu quả vì trước tiên bạn phải lấy edittext tập trung. Nhưng trong trường hợp của bạn, nó sẽ hoạt động hoàn hảo

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
Bạn có thể để lại một lời giải thích tại sao giải pháp của bạn hoạt động để người khác có thể hiểu và học hỏi từ nó? Cảm ơn!
Shawn

Chắc chắn Shawn. Tôi chỉ thay đổi nội dung hàng đầu, vì im mới để đặt ra nếu nó không được rõ ràng chỉ cho tôi biết và tôi sẽ mở rộng với nút onclick
Laert

Hãy tin tôi đây là một trong những cách làm thanh lịch nhất. Cảm ơn @Laert
WitVault

9

Đối với hoạt động,

InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

Đối với các đoạn, sử dụng getActivity ()

getActivity (). getSystemService ();

getActivity (). getCienF Focus ();

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);

7

Giải pháp này hoạt động hoàn hảo đối với tôi:

private void showKeyboard(EditText editText) {
    editText.requestFocus();
    editText.setFocusableInTouchMode(true);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    editText.setSelection(editText.getText().length());
}

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

3

Thử cái này...

  1. Để hiển thị bàn phím

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  2. Để ẩn bàn phím

    InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

Phương thức "For Hide keyboard" là một toogle (ẩn nếu hiển thị, hiển thị nếu bị ẩn) không phải là ẩn,
Ninja Coding

1
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}

Chào! Mặc dù câu trả lời này có thể đáp ứng nhu cầu của @Andrew nhưng nó sẽ rất tuyệt, nếu bạn có thể mở rộng nó với một số giải thích, để đảm bảo rằng những người đọc trong tương lai có thể được hưởng lợi tối đa!
derM

1

Ví dụ về Kotlin:

val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

từ mảnh vỡ:

inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

từ Hoạt động:

inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

0

Bạn sử dụng mã này trong sự kiện nhấn nút của bạn

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

0

Khắc phục sự cố ngoại lệ của Crash Null Point: Tôi gặp trường hợp bàn phím có thể không mở khi người dùng nhấp vào nút. Bạn phải viết một câu lệnh if để kiểm tra xem getCienF Focus () không phải là null:

            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

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.