Android - จัดการ“ Enter” ใน EditText


459

ฉันสงสัยว่ามีวิธีจัดการกับผู้ใช้ที่กดEnterในขณะพิมพ์หรือEditTextไม่เช่น onSubmit HTML event

นอกจากนี้ยังสงสัยว่าหากมีวิธีจัดการกับแป้นพิมพ์เสมือนจริงในลักษณะที่ปุ่ม "เสร็จสิ้น" จะมีข้อความกำกับอย่างอื่น (เช่น "ไป") และดำเนินการบางอย่างเมื่อคลิก (อีกครั้งเช่น onSubmit)


1
Kotlin & ส่วนขยาย: ดูที่นี่: stackoverflow.com/a/48810268/1912924
Francesco Donzello

คำตอบ:


374

ฉันสงสัยว่ามีวิธีจัดการกับผู้ใช้ที่กดEnterในขณะที่พิมพ์ใน EditText หรือไม่เช่นเหตุการณ์ onSubmit HTML

ใช่.

นอกจากนี้ยังสงสัยว่าหากมีวิธีจัดการกับแป้นพิมพ์เสมือนจริงในลักษณะที่ปุ่ม "เสร็จสิ้น" จะมีข้อความกำกับอย่างอื่น (เช่น "ไป") และดำเนินการบางอย่างเมื่อคลิก (อีกครั้งเช่น onSubmit)

ใช่แล้ว

คุณจะต้องการที่จะดูที่android:imeActionIdและandroid:imeOptionsคุณลักษณะรวมทั้งวิธีการทั้งหมดในsetOnEditorActionListener()TextView

สำหรับการเปลี่ยนข้อความของปุ่ม "เสร็จสิ้น" เป็นสตริงที่กำหนดเองให้ใช้:

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

26
(PS EditText ขยาย TextView จึงทำไมคุณสมบัติที่คุณควรมีลักษณะที่อยู่บน TextView - เมื่อครั้งแรกที่ผมอ่านว่าประโยคสุดท้ายที่ผมได้ใช้เวลาสองครั้ง :))
ricket

15
เป็นบันทึก แป้นพิมพ์บางรุ่นอาจไม่สนับสนุนคุณลักษณะ android มาตรฐาน: imeOptions ซึ่งน่าผิดหวังจริงๆ ตัวอย่างเช่น IME_ACTION_DONE ถูกกำหนดเป็น 6 โดยที่คีย์บอร์ดเริ่มต้นของ HTC (บนโทรศัพท์เช่น Incredible, Evo 4G) คีย์ส่งคืนถูกกำหนดเป็น 0
fernferret

13
นอกจากนี้หากคุณใช้ imeOptions ให้แน่ใจว่าคุณใช้ inputType = "text" หรือเทียบเท่าอื่น ๆ เพื่อให้แน่ใจว่าคีย์บอร์ดจะฟังคุณ! Nexus1
Blundell

6
"ใช่" - คุณจะอธิบายได้มากกว่านี้ไหม? เขาน่าจะถามว่าจะใช้โซลูชันอย่างไร
Al Wang

4
@AlWang: อันดับแรกข้อกังวลของคุณครอบคลุมอยู่ในคำตอบ (ดูที่การเริ่มต้นด้วย "คุณจะต้องการ ... ") ประการที่สองคำตอบนี้มาจากหกปีที่แล้วและอย่างใดอย่างหนึ่งจะเข้าใจว่าปัญหาของ OP ได้รับการแก้ไข ท้ายที่สุด OP ยอมรับคำตอบ
CommonsWare

267
final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});

1
ด้วยเหตุผลบางอย่างเมื่อฉันคลิกenterในข้อความแก้ไขข้อความแก้ไขทั้งหมดจะเลื่อนลง ... ฉันจะแก้ไขได้อย่างไร
Ruchir Baronia

1
@RuchirBaronia เพิ่ม android: maxLines = "1" ใน EditText ของคุณ EditText ของคุณไม่ใช่ "เลื่อนลง" แต่เป็นการแทรกตัวแบ่งบรรทัดลงในข้อความที่ป้อน การตั้งค่า maxLines เป็น 1 ช่วยป้องกันการแทรกตัวแบ่งบรรทัด
lustig

3
โซลูชันนี้ใช้งานได้เฉพาะกับคีย์บอร์ดฮาร์ดแวร์ไม่ใช่สำหรับคีย์บอร์ดนุ่ม / เสมือน หากคุณเชื่อใจแอปของคุณจะไม่ทำงานสำหรับผู้ใช้โดยไม่ต้องต่อคีย์บอร์ด
user3562927

12
ไม่มีการกระทำผิดกฎหมายที่จะ CommonsWare แต่คำตอบ RTFM ของเขาเป็นวิธีที่มีประโยชน์น้อยกว่าตัวอย่างง่ายๆนี้แสดงให้เห็นว่าวิธีการที่จะทำมัน ขอบคุณ!
AutonomousApps

1
@AutonomousApps ฉันมักจะเห็นคำตอบ CommonsWare เขาโชคดีที่ได้รับคำตอบตั้งแต่ปี 2009 เมื่อ Android เริ่มต้น บ่อยครั้งที่ "ใช่", "ไม่", "เป็นไปไม่ได้" และอื่น ๆ ซึ่งมักจะไม่มีรหัส บ่อยครั้งที่คำตอบของเขาล้าสมัยไปแล้วดังนั้นฉันจึงพยายามไม่ปฏิบัติตามคำแนะนำของเขา
CoolMind

215

นี่คือสิ่งที่คุณทำ มันยังซ่อนอยู่ในรหัสตัวอย่างของนักพัฒนา Android 'Bluetooth Chat' แทนที่ส่วนที่เป็นตัวหนาซึ่งพูดว่า"ตัวอย่าง"ด้วยตัวแปรและวิธีการของคุณเอง

ขั้นแรกให้นำเข้าสิ่งที่คุณต้องการในกิจกรรมหลักที่คุณต้องการให้ปุ่มย้อนกลับทำสิ่งพิเศษ:

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

ตอนนี้ทำตัวแปรประเภท TextViewOnEditorActionListener สำหรับคีย์ส่งคืนของคุณ (ที่นี่ฉันใช้exampleListener );

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

จากนั้นคุณต้องบอกผู้ฟังสองสิ่งเกี่ยวกับสิ่งที่ต้องทำเมื่อกดปุ่มย้อนกลับ จำเป็นต้องทราบว่า EditText ที่เรากำลังพูดถึงคืออะไร (ที่นี่ฉันใช้exampleView ) แล้วต้องรู้ว่าต้องทำอย่างไรเมื่อกดแป้น Enter (ที่นี่example_confirm () ) หากนี่เป็น EditText สุดท้ายหรืออย่างเดียวในกิจกรรมของคุณมันควรทำเช่นเดียวกับวิธีการ onClick สำหรับปุ่มส่งของคุณ (หรือตกลง, ยืนยัน, ส่ง, บันทึก ฯลฯ )

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

สุดท้ายตั้งค่าฟัง (ส่วนใหญ่ในวิธี onCreate ของคุณ);

exampleView.setOnEditorActionListener(exampleListener);

20
เยี่ยมมากฉันใช้ EditorInfo.IME_ACTION_SEND และฉันมีระบบ Android: imeOptions = "actionSend" บน XML
Bani

กำลังมองหา EditorInfo.IME_ACTION_SEND ไม่มีผลสำหรับฉัน (อีมูเลเตอร์) ดังนั้นในฐานะที่เป็นทริกเกอร์ที่เข้าใจไม่ได้ฉันยังค้นหา KeyEvent.KEYCODE_ENTER ดูที่นี่: stackoverflow.com/questions/2004344/…
คนอยู่ที่ไหนสักแห่งที่

4
KeyEvent.ACTION_UPก็มักจะดีกว่าที่จะดำเนินการกับ ในการสั่งซื้อสำหรับการทำงานคุณจะต้องแรกกินเหตุการณ์:ACTION_DOWN if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }จากนั้นคุณสามารถตรวจสอบACTION_UPกิจกรรมและดำเนินการ (คล้ายกับคำตอบข้างต้น) ถ้าคุณไม่กินACTION_DOWNเหตุการณ์แล้วจะไม่ถูกเรียกว่าonEditorAction ACTION_UP
ashughes

2
นี่คือสิ่งที่ทำงานให้ฉัน: if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}- ไม่สามารถทำงานอื่น ๆ ได้
Jonathan Ellis

38

คีย์บอร์ดฮาร์ดแวร์ให้ผลป้อนเหตุการณ์เสมอ แต่คีย์บอร์ดซอฟต์แวร์จะส่งคืนแอคชั่นและ null ที่แตกต่างกันใน SingleTine EditTexts รหัสนี้ตอบสนองทุกครั้งที่ผู้ใช้กดป้อนใน EditText ที่ฟังนี้ได้รับการตั้งค่าโดยไม่คำนึงถึง EditText หรือประเภทของแป้นพิมพ์

import android.view.inputmethod.EditorInfo;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.


    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

ลักษณะที่ปรากฏเป็นค่าเริ่มต้นของปุ่ม Enter ใน singleLine = false จะให้แป้นลูกศรเพื่อเข้าสู่ปุ่มกด เมื่อ singleLine = true ใน EditText ที่ผ่านมาคีย์แจ้งว่า DONE และใน EditTexts ก่อนที่มันจะบอกว่า NEXT ตามค่าเริ่มต้นลักษณะการทำงานนี้สอดคล้องกันกับตัวเลียนแบบวานิลลา, Android และ Google ทั้งหมด คุณลักษณะ scrollH แนวนอนไม่ได้สร้างความแตกต่างใด ๆ การทดสอบแบบ null มีความสำคัญเนื่องจากการตอบสนองของโทรศัพท์ต่อผู้ที่อ่อนนุ่มนั้นถูกทิ้งไว้กับผู้ผลิตและแม้แต่ผู้เลียนแบบผู้เลียนแบบระดับวานิลลา 16 ตอบสนองต่อผู้ที่อ่อนนุ่มยาวในหลายบรรทัดและ scrollHorizont EditTexts เหตุการณ์.


เมื่อฉันอัพเกรด Java ห่วงโซ่เครื่องมือ Android ของฉันก็พัง มันเป็น 32 บิต ฉันติดตั้งใหม่ทุกอย่างแบบ 64 บิตและค้นพบว่ามีอีมูเลเตอร์สาธารณะอื่น ๆ อีกมากมายที่พร้อมใช้งานในขณะนี้ ฉันต้องยอมรับว่าฉันรู้เพียงว่าพฤติกรรมของ EditorActionListener นั้นสอดคล้องกันในอีมูเลเตอร์ที่ฉันทดสอบ
earlcasper

เมื่อฉันโพสต์สิ่งนี้บนบล็อกของฉันมีคนแสดงความคิดเห็นว่าเพื่อให้ทำงานกับ eclipse ได้คุณต้องเปลี่ยนการกระทำของ ime ที่เป็นค่าเริ่มต้นโดยเพิ่ม android: imeOptions =” actionGo”
earlcasper

โอ๊ะฉันอ่านความคิดเห็นผิดในโพสต์บล็อกของฉัน เพื่อให้สามารถทำงานกับ eclipse ได้คุณจะต้องเปลี่ยนการกระทำของ ime ที่เป็นค่าเริ่มต้นโดยเพิ่ม android: imeOptions =” actionGo” ไปที่ 'EditText' ในเลย์เอาต์ xml
earlcasper

ในการสะท้อนต่อความคิดเห็นล่าสุดของฉันหมายถึงทั้ง Ant และ Eclipse
earlcasper

27

หน้านี้อธิบายวิธีการทำเช่นนี้อย่างแน่นอน

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

ตั้งค่าandroid: imeOptionsจากนั้นคุณเพียงตรวจสอบactionIdใน onEditorAction ดังนั้นหากคุณตั้งค่า imeOptions เป็น 'actionDone' คุณจะตรวจสอบ 'actionId == EditorInfo.IME_ACTION_DONE' ใน onEditorAction ตรวจสอบให้แน่ใจด้วยเพื่อตั้งค่า android: inputType

นี่คือ EditText จากตัวอย่างที่ลิงก์ด้านบน:

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

นอกจากนี้คุณยังสามารถตั้งค่านี้โปรแกรมใช้setImeOptions (int)ฟังก์ชั่น นี่คือ OnEditorActionListener จากตัวอย่างที่ลิงก์ด้านบน:

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

21

ฉันรู้ว่านี่เป็นปี แต่ฉันเพิ่งค้นพบงานนี้อย่างสมบูรณ์แบบสำหรับ EditText

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

มันป้องกันอะไรก็ได้ยกเว้นข้อความและช่องว่าง ฉันไม่สามารถแท็บ "ส่งคืน" ("\ n") หรืออะไรก็ได้


ทำงานให้ฉันด้วยการเพิ่ม IME_ACTION_DONE
htafoya

1
ทำงานได้อย่างสมบูรณ์แบบหากคุณต้องการปิดการใช้งานปุ่ม "Enter"
deeJ

16

เช่นเดียวกับภาคผนวกต่อการตอบสนองของ Chad (ซึ่งทำงานได้เกือบสมบูรณ์แบบสำหรับฉัน) ฉันพบว่าฉันต้องการเพิ่มการตรวจสอบประเภทการกระทำ KeyEvent เพื่อป้องกันไม่ให้โค้ดของฉันทำงานสองครั้ง เหตุการณ์)

if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
    // your code here
}

ดูhttp://developer.android.com/reference/android/view/KeyEvent.htmlสำหรับข้อมูลเกี่ยวกับการทำซ้ำกิจกรรมการกระทำ (กดปุ่ม Enter ค้างไว้) เป็นต้น


16

ฉันมีวัตถุประสงค์ที่คล้ายกัน ฉันต้องการแก้ไขการกดปุ่ม "Enter" บนแป้นพิมพ์ (ซึ่งฉันต้องการกำหนดเอง) ใน AutoCompleteTextView ซึ่งขยาย TextView ฉันลองวิธีแก้ไขปัญหาต่าง ๆ จากด้านบนและดูเหมือนว่าจะทำงาน แต่ฉันประสบปัญหาบางอย่างเมื่อฉันเปลี่ยนประเภทอินพุตบนอุปกรณ์ของฉัน (Nexus 4 ด้วย AOKP ROM) จาก SwiftKey 3 (ซึ่งทำงานได้อย่างสมบูรณ์) เป็นแป้นพิมพ์ Android มาตรฐาน (แทนที่จะจัดการรหัสของฉันจากผู้ฟังบรรทัดใหม่คือ ป้อนหลังจากกดปุ่ม "Enter" ฉันใช้เวลาสักครู่เพื่อจัดการกับปัญหานี้ แต่ฉันไม่รู้ว่ามันจะทำงานภายใต้สถานการณ์ทั้งหมดไม่ว่าคุณจะใช้อินพุตประเภทใด

ดังนั้นนี่คือทางออกของฉัน:

ตั้งค่าแอตทริบิวต์ประเภทอินพุตของ TextView ใน xml เป็น "text":

android:inputType="text"

ปรับแต่งป้ายกำกับของปุ่ม "Enter" บนคีย์บอร์ด:

myTextView.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

ตั้งค่า OnEditorActionListener เป็น TextView:

myTextView.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event)
    {
    boolean handled = false;
    if (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

        handled = true;
    }
    return handled;
    }
});

ฉันหวังว่าสิ่งนี้จะช่วยให้ผู้อื่นหลีกเลี่ยงปัญหาที่เกิดขึ้นเพราะพวกเขาเกือบทำให้ฉันกลัว


น่าเสียดายที่นี่ไม่ทำงานกับ SwiftKey เวอร์ชัน 4 ใหม่ และมันทำให้ฉันถั่วอีกครั้ง ... : - /
kaolick

3
IF ของคุณไม่ถูกต้อง ใช้: 'event.getKeyCode () == KeyEvent.KEYCODE_ENTER'
Loda

เหมาะสำหรับฉัน อย่าลืมใส่ setImeActionLabel อีกครั้งในคำสั่ง IF มิฉะนั้นข้อความที่กำหนดเองจะหายไปหลังจากการกดครั้งแรก
Steve Rogers

IF ของเขาถูกต้องเพราะเขาตั้งค่า actionId ของเขาเป็น KeyEvent.KEYCODE_ENTER ด้านบน :-D แต่ใช่คนอื่น ๆ อาจต้องการใช้ event.getKeyCode () == KeyEvent.KEYCODE_ENTER
Ray Hulha

15

ใน xml ของคุณเพิ่มแอ็ตทริบิวต์ imeOptions ไปที่ editText

<EditText
    android:id="@+id/edittext_additem"
    ...
    android:imeOptions="actionDone"
    />

จากนั้นในโค้ด Java ของคุณให้เพิ่ม OnEditorActionListener ไปที่ EditText เดียวกัน

mAddItemEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(actionId == EditorInfo.IME_ACTION_DONE){
                //do stuff
                return true;
            }
            return false;
        }
    });

นี่คือคำอธิบาย - imeOptions = actionDone จะกำหนด "actionDone" ให้กับ EnterKey EnterKey ในแป้นพิมพ์จะเปลี่ยนจาก "Enter" เป็น "Done" ดังนั้นเมื่อกดปุ่ม Enter มันจะทำการกระทำนี้และคุณจะจัดการมัน


9

คุณสามารถทำได้ ..

editText.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getKeyCode() ==       KeyEvent.KEYCODE_ENTER) 
                {
                    Log.i("event", "captured");

                    return false;
                } 

            return false;
        }
    });

ด้วยเหตุผลบางอย่างเมื่อฉันคลิกenterในข้อความแก้ไขข้อความแก้ไขทั้งหมดจะเลื่อนลง ... ฉันจะแก้ไขได้อย่างไร
Ruchir Baronia

ฉันคิดว่าคุณต้องการเรียนรู้stackoverflow.com/questions/10978038/ … othewise แสดง xml ของคุณให้ฉัน
Jawad Zeb

6
     password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                submit.performClick();
                return true;
            }
            return false;
        }
    });

ทำงานได้ดีมากสำหรับฉัน
นอกจากซ่อนแป้นพิมพ์


5

ก่อนอื่นคุณต้องตั้งค่า EditText ฟังการกดปุ่ม

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    // Set the EditText listens to key press
    EditText edittextproductnumber = (EditText) findViewById(R.id.editTextproductnumber);
    edittextproductnumber.setOnKeyListener(this);

}

ประการที่สองกำหนดกิจกรรมตามการกดปุ่มตัวอย่างเช่นเหตุการณ์เพื่อตั้งค่าข้อความของ TextView:

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

 // Listen to "Enter" key press
 if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
 {
     TextView textviewmessage = (TextView) findViewById(R.id.textViewmessage);
     textviewmessage.setText("You hit 'Enter' key");
     return true;
 }

return false;   

}

และสุดท้ายอย่าลืมนำเข้า EditText, TextView, OnKeyListener, KeyEvent ที่ด้านบน:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;

5

ทำงานได้อย่างสมบูรณ์แบบ

public class MainActivity extends AppCompatActivity {  
TextView t;
Button b;
EditText e;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b = (Button) findViewById(R.id.b);
    e = (EditText) findViewById(R.id.e);

    e.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            if (before == 0 && count == 1 && s.charAt(start) == '\n') {

                b.performClick();
                e.getText().replace(start, start + 1, ""); //remove the <enter>
            }

        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable s) {}
    });

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            b.setText("ok");

        }
    });
}

}

ทำงานได้อย่างสมบูรณ์แบบ


5
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId != 0 || event.getAction() == KeyEvent.ACTION_DOWN) {
                // Action
                return true;
            } else {
                return false;
            }
        }
    });

xml

<EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionGo|flagNoFullscreen"
        android:inputType="textPassword"
        android:maxLines="1" />

4

สิ่งนี้น่าจะใช้ได้

input.addTextChangedListener(new TextWatcher() {

           @Override
           public void afterTextChanged(Editable s) {}

           @Override    
           public void beforeTextChanged(CharSequence s, int start,
             int count, int after) {
           }

           @Override    
           public void onTextChanged(CharSequence s, int start,
             int before, int count) {
               if( -1 != input.getText().toString().indexOf( "\n" ) ){
                   input.setText("Enter was pressed!");
                    }
           }
          });

4

พิมพ์รหัสนี้ในโปรแกรมแก้ไขของคุณเพื่อให้สามารถนำเข้าโมดูลที่จำเป็น

 query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });

query = ชื่อฟิลด์ EditText และเพิ่ม -> (android: imeOptions = "actionSearch") ใน xml ของ EditText
Sanjit Prasad

3

ใช้งานได้กับโทรศัพท์ LG Android มันป้องกันENTERและอักขระพิเศษอื่น ๆ ที่จะตีความว่าเป็นตัวละครปกติ NextหรือDoneปุ่มปรากฏขึ้นโดยอัตโนมัติและENTERทำงานตามที่คาดไว้

edit.setInputType(InputType.TYPE_CLASS_TEXT);

นี่คือสิ่งเดียวที่ใช้ได้สำหรับฉัน ฉันมี Motorola Moto X 2 และโดยปกติจะมีปุ่ม "Return" พร้อมลูกศรและทุกอย่าง สิ่งนี้เปลี่ยนเป็นเครื่องหมายถูกและในที่สุดฉันก็สามารถทำให้ผู้ฟังทำงานได้ (ก่อนที่จะเพิ่งสร้างบรรทัดใหม่) ดังนั้นถ้าคนอื่นจะมีปัญหาที่ ...
โคล่าลึกลับ

2

นี่คือฟังก์ชั่นแบบคงที่ง่าย ๆ ที่คุณสามารถใส่เข้าไปในUtilsหรือKeyboardsคลาสของคุณที่จะรันโค้ดเมื่อผู้ใช้กดปุ่มส่งคืนบนฮาร์ดแวร์หรือซอฟต์แวร์แป้นพิมพ์ มันเป็นคำตอบที่ยอดเยี่ยมของ @ earlcasper รุ่นดัดแปลง

 /**
 * Return a TextView.OnEditorActionListener that will execute code when an enter is pressed on
 * the keyboard.<br>
 * <code>
 *     myTextView.setOnEditorActionListener(Keyboards.onEnterEditorActionListener(new Runnable()->{
 *         Toast.makeText(context,"Enter Pressed",Toast.LENGTH_SHORT).show();
 *     }));
 * </code>
 * @param doOnEnter A Runnable for what to do when the user hits enter
 * @return the TextView.OnEditorActionListener
 */
public static TextView.OnEditorActionListener onEnterEditorActionListener(final Runnable doOnEnter){
    return (__, actionId, event) -> {
        if (event==null) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // Capture soft enters in a singleLine EditText that is the last EditText.
                doOnEnter.run();
                return true;
            } else if (actionId==EditorInfo.IME_ACTION_NEXT) {
                // Capture soft enters in other singleLine EditTexts
                doOnEnter.run();
                return true;
            } else {
                return false;  // Let system handle all other null KeyEvents
            }
        } else if (actionId==EditorInfo.IME_NULL) {
            // Capture most soft enters in multi-line EditTexts and all hard enters.
            // They supply a zero actionId and a valid KeyEvent rather than
            // a non-zero actionId and a null event like the previous cases.
            if (event.getAction()==KeyEvent.ACTION_DOWN) {
                // We capture the event when key is first pressed.
                return true;
            } else {
                doOnEnter.run();
                return true;   // We consume the event when the key is released.
            }
        } else {
            // We let the system handle it when the listener
            // is triggered by something that wasn't an enter.
            return false;
        }
    };
}

โปรดทราบว่านี่ใช้การแสดงออกแลมบ์ดาซึ่งต้องใช้ Java 1.8 แต่มันง่ายพอที่จะแปลงเป็นแลมบ์ดาไม่ได้ อย่างไรก็ตามปัญหาที่ฉันเห็นด้วยวิธีแก้ปัญหาประเภทนี้คือคีย์บอร์ดเสมือนไม่ซ่อนอัตโนมัติและหากอยู่ในโหมดเต็มหน้าจอ (อุปกรณ์ขนาดเล็กในแนวนอน) โหมดเต็มหน้าจอจะไม่ปิดลงหลังจากผู้ใช้กด Enter หรือ DONE
jk7

2

InputType บนฟิลด์ข้อความต้องอยู่textในลำดับที่ CommonsWare บอกว่าใช้งานได้ เพิ่งลองทั้งหมดนี้ไม่มีประเภทอินพุตก่อนการทดลองและไม่มีอะไรทำงาน Enter เข้าสู่การลงทะเบียนอย่างนุ่มนวล หลังจากนั้นinputType = textทุกอย่างรวมถึง setImeLabel ก็ทำงานได้

ตัวอย่าง: android:inputType="text"


2
   final EditText edittext = (EditText) findViewById(R.id.edittext);
    edittext.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                // Perform action on key press
                Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

1

วิธีที่เชื่อถือได้ในการตอบสนองต่อ <enter> ใน EditText อยู่กับTextWatcherเป็นLocalBroadcastManagerและBroadcastReceiver คุณต้องเพิ่มไลบรารีการสนับสนุน v4เพื่อใช้ LocalBroadcastManager ฉันใช้บทช่วยสอนที่vogella.com : 7.3 "เหตุการณ์การออกอากาศในท้องถิ่นด้วย LocalBroadcastManager" เนื่องจากตัวอย่างรหัสย่อที่สมบูรณ์ ใน onTextChanged beforeคือดัชนีของจุดสิ้นสุดของการเปลี่ยนแปลงก่อนการเปลี่ยนแปลง >; ลบเริ่มต้น เมื่ออยู่ใน TextWatcher เธรด UI กำลังยุ่งอยู่กับการอัปเดตของ editText ดังนั้นเราจึงส่ง Intent เพื่อปลุก BroadcastReceiver เมื่อเธรด UI เสร็จสิ้นการอัพเดต editText

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.Editable;
//in onCreate:
editText.addTextChangedListener(new TextWatcher() {
  public void onTextChanged
  (CharSequence s, int start, int before, int count) {
    //check if exactly one char was added and it was an <enter>
    if (before==0 && count==1 && s.charAt(start)=='\n') {
    Intent intent=new Intent("enter")
    Integer startInteger=new Integer(start);
    intent.putExtra("Start", startInteger.toString()); // Add data
    mySendBroadcast(intent);
//in the BroadcastReceiver's onReceive:
int start=Integer.parseInt(intent.getStringExtra("Start"));
editText.getText().replace(start, start+1,""); //remove the <enter>
//respond to the <enter> here

หากใช้ประเภทอินพุตข้อความ * ใด ๆ (เช่นandroid:inputType="textCapSentences") การรับคืนจะถูกกรองออกจากอินพุตดังนั้น onTextChanged () จะไม่ถูกเรียกเมื่อผู้ใช้กดปุ่ม Enter
jk7

1

ยังไม่ได้รับคำตอบสำหรับคำถามนี้กับ Butterknife

เค้าโครง XML

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/some_input_hint">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/textinput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionSend"
            android:inputType="text|textCapSentences|textAutoComplete|textAutoCorrect"/>
    </android.support.design.widget.TextInputLayout>

JAVA APP

@OnEditorAction(R.id.textinput)
boolean onEditorAction(int actionId, KeyEvent key){
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND || (key.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
        //do whatever you want
        handled = true;
    }
    return handled;
}

TextInputLayout และ Butterknife: ชนะ!
Javi

1

การใช้ Kotlin ฉันได้ทำฟังก์ชั่นที่จัดการการกระทำที่ "เสร็จสิ้น" เช่นเดียวกับ EditText รวมถึงแป้นพิมพ์และเป็นไปได้ที่จะแก้ไขและจัดการกับคีย์อื่น ๆ ตามที่คุณต้องการเช่นกัน:

private val DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_DONE)
private val DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)

fun EditText.setOnDoneListener(function: () -> Unit, onKeyListener: OnKeyListener? = null, onEditorActionListener: TextView.OnEditorActionListener? = null,
                               actionsToHandle: Collection<Int> = DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT,
                               keysToHandle: Collection<Int> = DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT) {
    setOnEditorActionListener { v, actionId, event ->
        if (onEditorActionListener?.onEditorAction(v, actionId, event) == true)
            return@setOnEditorActionListener true
        if (actionsToHandle.contains(actionId)) {
            function.invoke()
            return@setOnEditorActionListener true
        }
        return@setOnEditorActionListener false
    }
    setOnKeyListener { v, keyCode, event ->
        if (onKeyListener?.onKey(v, keyCode, event) == true)
            return@setOnKeyListener true
        if (event.action == KeyEvent.ACTION_DOWN && keysToHandle.contains(keyCode)) {
            function.invoke()
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
}

ดังนั้นการใช้งานตัวอย่าง:

        editText.setOnDoneListener({
            //do something
        })

ในฐานะที่เป็นสำหรับการเปลี่ยนฉลากผมคิดว่ามันขึ้นอยู่กับแอปแป้นพิมพ์และมันมักจะเปลี่ยนเฉพาะในภูมิทัศน์ตามที่เขียนไว้ที่นี่ อย่างไรก็ตามการใช้ตัวอย่างสำหรับสิ่งนี้:

        editText.imeOptions = EditorInfo.IME_ACTION_DONE
        editText.setImeActionLabel("ASD", editText.imeOptions)

หรือถ้าคุณต้องการใน XML:

    <EditText
        android:id="@+id/editText" android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:imeActionLabel="ZZZ" android:imeOptions="actionDone" />

และผลลัพธ์ (แสดงในแนวนอน):

ป้อนคำอธิบายรูปภาพที่นี่


0

เพิ่มความเป็นอิสระเหล่านี้และควรใช้งานได้:

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;

0

สิ่งนี้จะทำให้คุณมีฟังก์ชั่น callable เมื่อผู้ใช้กดปุ่มย้อนกลับ

fun EditText.setLineBreakListener(onLineBreak: () -> Unit) {
    val lineBreak = "\n"
    doOnTextChanged { text, _, _, _ ->
        val currentText = text.toString()

        // Check if text contains a line break
        if (currentText.contains(lineBreak)) {

            // Uncommenting the lines below will remove the line break from the string
            // and set the cursor back to the end of the line

            // val cleanedString = currentText.replace(lineBreak, "")
            // setText(cleanedString)
            // setSelection(cleanedString.length)

            onLineBreak()
        }
    }
}

การใช้

editText.setLineBreakListener {
    doSomething()
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.