ใช้ปุ่ม“ ENTER” บนซอฟต์คีย์บอร์ดแทนการคลิกปุ่ม


94

สวัสดีฉันมีการสืบค้นและการค้นหาEditText Buttonเมื่อฉันพิมพ์ข้อความที่ค้นหาฉันต้องการใช้ปุ่มENTERบนซอฟต์คีย์บอร์ดแทนการค้นหาButtonเพื่อเปิดใช้งานฟังก์ชันการค้นหา

ขอบคุณสำหรับความช่วยเหลือล่วงหน้า

คำตอบ:


154

คุณทำได้โดยการตั้งค่าOnKeyListenerบนEditTextไฟล์.

นี่คือตัวอย่างจากโค้ดของฉันเอง ฉันมีEditTextชื่อaddCourseTextซึ่งจะเรียกใช้ฟังก์ชันaddCourseFromTextBoxเมื่อคลิกปุ่ม Enter หรือ 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
จริงๆแล้วไม่รับประกันสำหรับซอฟต์คีย์ ตัวอย่างเช่นใช้ไม่ได้กับ "ENTER" บน Nexus 7 (Android 4.2) และสำหรับ "BACK"
Ghedeon

4
@Ghedeon คุณสามารถตั้งค่าandroid:inputType="text"xml สำหรับข้อความแก้ไขเพื่อแสดงแป้น Enter เทียบกับแป้นพิมพ์เริ่มต้นที่มีการคืนค่าขนส่ง
นิค

2
วิธีนี้ไม่รับประกันว่าจะใช้งานได้เหมือน Jellybean โปรดดูที่developer.android.com/reference/android/view/KeyEvent.html
Constantin

@Ghedeon แล้วคุณจะใช้งาน "ENTER" บน Nexus 7 ได้อย่างไร
HairOfTheDog

3
โซลูชันนี้ใช้งานไม่ได้ในหลายอุปกรณ์รวมถึง Nexus 7 อย่าใช้มัน!
Stevey

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" />

จากนั้นคุณสามารถฟังการกดบนปุ่มการดำเนินการโดยกำหนด TextView OnEditorActionListener สำหรับองค์ประกอบ EditText ใน Listener ของคุณให้ตอบกลับ ID การดำเนินการ IME ที่เหมาะสมซึ่งกำหนดไว้ในคลาส EditorInfo เช่น IME_ACTION_SEND ตัวอย่างเช่น:

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

ที่มา: https://developer.android.com/training/keyboard-input/style.html


26

คุณอาจเพิ่มแอตทริบิวต์ใน EditText ของคุณได้ดังนี้:

android:imeOptions="actionSearch"

1
นี่เป็นวิธีแก้ปัญหาที่ง่ายกว่าหากคุณกำลังสร้างข้อความแก้ไขการค้นหา
stevyhacker

จำเป็นต้องตั้งค่าandroid:inputType="text"เช่นกัน
li2

6

เพิ่มแอตทริบิวต์ใน EditText เช่น android: imeOptions = "actionSearch"

นี่คือวิธีที่ดีที่สุดในการทำหน้าที่

และ imeOptions ยังมีค่าอื่น ๆ เช่น "go"、 "next"、 "done" เป็นต้น


2

เรายังสามารถใช้ 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

เพื่อหลีกเลี่ยงไม่ให้โฟกัสเลื่อนไปยังช่องถัดไปที่แก้ไขได้ (ถ้าคุณมี) คุณอาจต้องการละเว้นเหตุการณ์การกดแป้นลง แต่จัดการเหตุการณ์สำคัญ ฉันชอบกรองบน ​​keyCode เป็นอันดับแรกโดยสมมติว่ามันจะมีประสิทธิภาพมากกว่าเล็กน้อย อย่างไรก็ตามอย่าลืมว่าการกลับมาเป็นจริงหมายความว่าคุณได้จัดการเหตุการณ์แล้วดังนั้นจึงไม่มีผู้ฟังคนอื่น ๆ อย่างไรก็ตามนี่คือเวอร์ชันของฉัน

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

นี่คือตัวอย่างหนึ่งในแอปของฉันที่ฉันจัดการ

 //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

วิธีที่อัปเดตที่สุดในการบรรลุเป้าหมายนี้คือ:

เพิ่มสิ่งนี้ใน EditText ของคุณใน XML:

android:imeOptions="actionSearch"

จากนั้นในกิจกรรม / ส่วนของคุณ:

EditText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_SEARCH) {
        // Do what you want here
        return@setOnEditorActionListener true
    }
    return@setOnEditorActionListener false
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.