Sử dụng phím "ENTER" trên bàn phím mềm thay vì nhấp vào nút


94

Xin chào, tôi đã tìm kiếm EditTextvà tìm kiếm Button. Khi tôi nhập văn bản đã tìm kiếm, tôi muốn sử dụng phím ENTER trên bàn phím mềm thay vì tìm kiếm Buttonđể kích hoạt chức năng tìm kiếm.

Nhờ sự giúp đỡ trước.

Câu trả lời:


155

Bạn làm điều đó bằng cách thiết lập một OnKeyListenertrên của bạn EditText.

Đây là một mẫu từ mã của riêng tôi. Tôi có một EditTextcái tên được đặt tên addCourseText, hàm này sẽ gọi hàm addCourseFromTextBoxkhi nhấn phím enter hoặc phím d-pad.

addCourseText = (EditText) findViewById(R.id.clEtAddCourse);
addCourseText.setOnKeyListener(new OnKeyListener()
{
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
        if (event.getAction() == KeyEvent.ACTION_DOWN)
        {
            switch (keyCode)
            {
                case KeyEvent.KEYCODE_DPAD_CENTER:
                case KeyEvent.KEYCODE_ENTER:
                    addCourseFromTextBox();
                    return true;
                default:
                    break;
            }
        }
        return false;
    }
});

4
Trên thực tế, nó không được đảm bảo cho các phím mềm. Ví dụ: nó không hoạt động đối với "ENTER" trên Nexus 7 (Android 4.2) và đối với "BACK" thì nó không hoạt động.
Ghedeon

4
@Ghedeon bạn có thể đặt android:inputType="text"xml cho văn bản chỉnh sửa để hiển thị phím enter so với bàn phím mặc định có dấu xuống dòng.
Nick

2
Phương pháp này không được bảo đảm để hoạt động như Jellybean, hãy xem developer.android.com/reference/android/view/KeyEvent.html
Constantin

@Ghedeon, vậy làm cách nào để bạn có thể làm cho nó hoạt động cho "ENTER" trên Nexus 7?
HairOfTheDog,

3
Giải pháp này hoàn toàn bị hỏng trên nhiều thiết bị, bao gồm cả Nexus 7. Đừng sử dụng nó!
dùng3562927

44
<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

Sau đó, bạn có thể lắng nghe các lần nhấn vào nút hành động bằng cách xác định TextView.OnEditorActionListener cho phần tử EditText. Trong bộ lắng nghe của bạn, hãy trả lời ID hành động IME thích hợp được xác định trong lớp EditorInfo, chẳng hạn như IME_ACTION_SEND. Ví dụ:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

Nguồn: https://developer.android.com/training/keyboard-input/style.html


26

Có thể bạn có thể thêm một thuộc tính vào EditText của mình như thế này:

android:imeOptions="actionSearch"

1
Đây là giải pháp đơn giản hơn nếu bạn đang tạo một văn bản chỉnh sửa tìm kiếm.
stevyhacker

cần phải thiết lập android:inputType="text"cũng
LI2

6

thêm một thuộc tính vào EditText như android: imeOptions = "actionSearch"

đây là cách tốt nhất để thực hiện chức năng

và imeOptions cũng có một số giá trị khác như "go" 、 "next" 、 "done" v.v.


2

Chúng tôi cũng có thể sử dụng Kotlin lambda

editText.setOnKeyListener { _, keyCode, keyEvent ->
        if (keyEvent.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
            Log.d("Android view component", "Enter button was pressed")
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }

0

Để tránh tiêu điểm chuyển sang trường có thể chỉnh sửa tiếp theo (nếu bạn có), bạn có thể muốn bỏ qua các sự kiện từ khóa xuống nhưng xử lý các sự kiện từ khóa lên. Tôi cũng thích lọc trước trên Mã khóa, giả sử rằng nó sẽ hiệu quả hơn một chút. Nhân tiện, hãy nhớ rằng trả về true có nghĩa là bạn đã xử lý sự kiện, vì vậy sẽ không có người nghe nào khác. Dù sao, đây là phiên bản của tôi.

ETFind.setOnKeyListener(new OnKeyListener()
{
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
        if (keyCode ==  KeyEvent.KEYCODE_DPAD_CENTER
        || keyCode ==  KeyEvent.KEYCODE_ENTER) {

            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                // do nothing yet
            } else if (event.getAction() == KeyEvent.ACTION_UP) {
                        findForward();      
            } // is there any other option here?...

            // Regardless of what we did above,
            // we do not want to propagate the Enter key up
            // since it was our task to handle it.
            return true;

        } else {
            // it is not an Enter key - let others handle the event
            return false;
        }
    }

});

0

đây là ví dụ về một trong những ứng dụng của tôi, cách tôi xử lý

 //searching for the Edit Text in the view    
    final EditText myEditText =(EditText)view.findViewById(R.id.myEditText);
        myEditText.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                 if (event.getAction() == KeyEvent.ACTION_DOWN)
                      if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) ||
                             (keyCode == KeyEvent.KEYCODE_ENTER)) {
                                //do something
                                //true because you handle the event
                                return true;
                               }
                       return false;
                       }
        });

0

Cách cập nhật nhất để đạt được điều này là:

Thêm cái này vào EditText của bạn trong XML:

android:imeOptions="actionSearch"

Sau đó, trong Activity / Fragment của bạn:

EditText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_SEARCH) {
        // Do what you want here
        return@setOnEditorActionListener true
    }
    return@setOnEditorActionListener false
}
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.