Android - Pegang "Enter" dalam EditText

459

Saya bertanya-tanya apakah ada cara untuk menangani pengguna menekan Entersaat mengetik EditText, sesuatu seperti acara HTML onSubmit.

Juga bertanya-tanya apakah ada cara untuk memanipulasi keyboard virtual sedemikian rupa sehingga tombol "Selesai" diberi label sesuatu yang lain (misalnya "Pergi") dan melakukan tindakan tertentu ketika diklik (lagi, seperti onSubmit).

Felix
sumber
1
Kotlin & Extensions: lihat di sini: stackoverflow.com/a/48810268/1912924
Francesco Donzello

Jawaban:

374

Saya bertanya-tanya apakah ada cara untuk menangani pengguna menekan Entersambil mengetik di EditText, sesuatu seperti acara HTML onSubmit.

Iya.

Juga bertanya-tanya apakah ada cara untuk memanipulasi keyboard virtual sedemikian rupa sehingga tombol "Selesai" diberi label sesuatu yang lain (misalnya "Pergi") dan melakukan tindakan tertentu ketika diklik (lagi, seperti onSubmit).

Juga ya.

Anda akan ingin melihat atribut android:imeActionIddan android:imeOptions, ditambah setOnEditorActionListener()metode, semua aktif TextView.

Untuk mengubah teks tombol "Selesai" menjadi string khusus, gunakan:

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);
CommonsWare
sumber
26
(PS EditText memperluas TextView, jadi mengapa properti yang harus Anda lihat ada di TextView - ketika saya pertama kali membaca kalimat terakhir saya melakukan double-take :))
Ricket
15
Sebagai catatan. Tidak semua keyboard mendukung atribut android: imeOptions standar. Yang benar-benar mengecewakan. Misalnya, IME_ACTION_DONE didefinisikan sebagai 6, di mana keyboard default HTC (Pada ponsel seperti Incredible, Evo 4G) kunci kembali didefinisikan sebagai 0.
fernferret
13
Juga jika Anda menggunakan imeOptions memastikan Anda juga menggunakan inputType = "teks" atau yang setara lainnya. Untuk memastikan keyboard mendengarkan Anda! Nexus1
Blundell
6
"Ya" - Apakah Anda akan lebih deskriptif dari ini? Dia kemungkinan akan bertanya bagaimana menerapkan solusi.
Al Wang
4
@AlWang: Pertama, bidang perhatian Anda tercakup dalam jawaban (lihat mulai dengan "Anda ingin ..."). Kedua, jawaban ini dari enam tahun yang lalu , dan orang akan menganggap bahwa masalah OP telah terpecahkan. Bagaimanapun, OP menerima jawabannya.
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;
    }
});
Hukum Jarod DY
sumber
1
Untuk beberapa alasan ketika saya mengklik enterdi teks edit saya, seluruh teks edit bergerak ke bawah ... Bagaimana saya bisa memperbaikinya?
Ruchir Baronia
1
@RuchirBaronia Tambahkan android: maxLines = "1" ke EditText Anda. EditText Anda tidak "bergerak turun", melainkan memasukkan garis pemisah ke dalam teks yang dimasukkan. Pengaturan maxLines ke 1 mencegah jeda baris dimasukkan.
lustig
3
Solusi ini hanya berfungsi untuk keyboard perangkat keras, BUKAN untuk keyboard lunak / virtual. Jika Anda mengandalkannya, maka aplikasi Anda akan rusak untuk pengguna tanpa keyboard yang terpasang.
user3562927
12
Tidak ada pelanggaran terhadap CommonsWare, tetapi jawaban RTFM-nya jauh lebih tidak berguna daripada contoh sederhana ini yang menunjukkan dengan tepat bagaimana melakukannya. Terima kasih!
AutonomousApps
1
@ AutonomousApps, saya sering melihat jawaban CommonsWare. Dia beruntung menjawab sejak 2009, ketika Android dimulai. Seringkali "ya", "tidak", "tidak mungkin" dan seterusnya, biasanya tanpa kode. Seringkali jawabannya sudah usang sekarang, jadi saya mencoba untuk tidak mengikuti rekomendasinya.
CoolMind
215

Inilah yang Anda lakukan. Itu juga tersembunyi di kode sampel Pengembang Android 'Bluetooth Chat'. Ganti bagian tebal yang mengatakan "contoh" dengan variabel dan metode Anda sendiri.

Pertama, impor apa yang Anda butuhkan ke dalam Kegiatan utama di mana Anda ingin tombol kembali untuk melakukan sesuatu yang istimewa:

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

Sekarang, buat variabel bertipe TextView.OnEditorActionListener untuk kunci pengembalian Anda (di sini saya menggunakan exampleListener );

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

Maka Anda perlu memberi tahu pendengar dua hal tentang apa yang harus dilakukan ketika tombol kembali ditekan. Perlu tahu apa yang sedang kita bicarakan EditText (di sini saya menggunakan exampleView ), dan kemudian perlu tahu apa yang harus dilakukan ketika tombol Enter ditekan (di sini, example_confirm () ). Jika ini adalah EditText terakhir atau satu-satunya dalam Aktivitas Anda, itu harus melakukan hal yang sama seperti metode onClick untuk tombol Kirim (atau OK, Konfirmasi, Kirim, Simpan, dll).

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

Terakhir, atur pendengar (kemungkinan besar dalam metode onCreate Anda);

exampleView.setOnEditorActionListener(exampleListener);
Chad Hedgcock
sumber
20
Bagus, saya telah menggunakan EditorInfo.IME_ACTION_SEND dan saya punya android: imeOptions = "actionSend" pada XML.
Bani
mencari EditorInfo.IME_ACTION_SEND tidak berpengaruh untuk saya (emulator) sehingga sebagai pemicu yang sangat mudah saya juga mencari KeyEvent.KEYCODE_ENTER. Lihat di sini: stackoverflow.com/questions/2004344/...
Seseorang di suatu tempat
4
Biasanya lebih baik melakukan tindakan KeyEvent.ACTION_UP. Agar ini bekerja, Anda harus terlebih dahulu mengkonsumsi ACTION_DOWNacara: if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }. Kemudian Anda dapat memeriksa ACTION_UPacara dan melakukan tindakan (mirip dengan jawaban di atas). Jika Anda tidak mengkonsumsi ACTION_DOWNacara tersebut, maka onEditorActiontidak akan dipanggil ACTION_UP.
ashughes
2
Inilah yang berhasil bagi saya: if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}- tidak dapat melakukan pendekatan lain untuk bekerja
Jonathan Ellis
38

Keyboard perangkat keras selalu menghasilkan acara yang dimasukkan, tetapi keyboard perangkat lunak mengembalikan actionID dan null yang berbeda di singleLine EditTexts. Kode ini merespons setiap kali pengguna menekan masuk dalam EditText bahwa pendengar ini telah diatur, terlepas dari EditText atau jenis keyboard.

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

Tampilan default tombol enter di singleLine = false memberikan tanda panah masuk bengkok. Ketika singleLine = true di EditText terakhir kuncinya mengatakan DONE, dan pada EditTexts sebelum itu tertulis NEXT. Secara default, perilaku ini konsisten di semua emulator vanilla, android, dan google. Atribut scrollHorizontal tidak ada bedanya. Tes nol penting karena respons ponsel terhadap soft enters diserahkan kepada pabrikan dan bahkan di emulator, emulator vanilla Level 16 merespons soft soft lama dalam multi-line dan scroll. acara.

earlcasper
sumber
Ketika saya memutakhirkan Java, rantai alat Android saya putus. Itu 32-bit. Saya menginstal ulang semuanya 64-bit dan menemukan bahwa ada banyak versi emulator publik yang tersedia sekarang. Saya harus mengakui bahwa saya hanya tahu bahwa perilaku EditorActionListener konsisten dalam emulator yang saya uji.
earlcasper
Ketika saya memposting ini di blog saya, seseorang berkomentar bahwa untuk membuatnya bekerja pada gerhana Anda perlu mengubah tindakan ime default, menambahkan android: imeOptions = "actionGo".
earlcasper
Ups, saya salah membaca komentar di posting blog saya. Untuk membuatnya berfungsi pada gerhana, Anda perlu mengubah tindakan ime default, menambahkan android: imeOptions = "actionGo". ke 'EditText' di tata letak xml.
earlcasper
Pada refleksi lebih lanjut, komentar terakhir saya mengacu pada Ant dan Eclipse
earlcasper
27

Halaman ini menjelaskan dengan tepat bagaimana melakukan ini.

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

Atur android: imeOptions maka Anda cukup memeriksa actionId di onEditorAction. Jadi jika Anda mengatur imeOptions ke 'actionDone' maka Anda akan memeriksa 'actionId == EditorInfo.IME_ACTION_DONE' di onEditorAction. Juga, pastikan untuk mengatur android: inputType.

Berikut EditText dari contoh yang ditautkan di atas:

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

Anda juga dapat mengatur ini secara terprogram menggunakan fungsi setImeOptions (int) . Inilah OnEditorActionListener dari contoh yang ditautkan di atas:

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;
    }
});
Mike
sumber
21

Saya tahu ini berumur satu tahun, tetapi saya baru menemukan ini berfungsi dengan baik untuk EditText.

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

Ini mencegah apa pun selain teks dan ruang. Saya tidak bisa meng-tab, "return" ("\ n"), atau apa pun.

Pemula
sumber
Bekerja untuk saya, dengan tambahan IME_ACTION_DONE
htafoya
1
Berfungsi dengan sangat baik jika Anda ingin menonaktifkan kunci "Enter".
deeJ
16

Sama seperti tambahan untuk respons Chad (yang bekerja hampir sempurna untuk saya), saya menemukan bahwa saya perlu menambahkan tanda centang pada jenis tindakan KeyEvent untuk mencegah kode saya dieksekusi dua kali (sekali pada kunci-atas dan sekali pada kunci-bawah) peristiwa).

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

Lihat http://developer.android.com/reference/android/view/KeyEvent.html untuk info tentang pengulangan acara tindakan (menahan tombol enter) dll.

kermitologi
sumber
16

Saya memiliki tujuan yang sama. Saya ingin menyelesaikan menekan tombol "Enter" pada keyboard (yang ingin saya sesuaikan) di AutoCompleteTextView yang memperluas TextView. Saya mencoba berbagai solusi dari atas dan sepertinya berhasil. TETAPI saya mengalami beberapa masalah ketika saya mengganti tipe input pada perangkat saya (Nexus 4 dengan AOKP ROM) dari SwiftKey 3 (yang berfungsi dengan sempurna) ke keyboard Android standar (di mana alih-alih menangani kode saya dari pendengar, baris baru adalah dimasukkan setelah menekan tombol "Enter". Butuh beberapa saat untuk menangani masalah ini, tetapi saya tidak tahu apakah itu akan berfungsi dalam semua keadaan apa pun jenis input yang Anda gunakan.

Jadi, inilah solusi saya:

Setel atribut tipe input dari TextView di xml ke "teks":

android:inputType="text"

Kustomisasi label tombol "Enter" pada keyboard:

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

Setel OnEditorActionListener ke 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;
    }
});

Saya harap ini dapat membantu orang lain untuk menghindari masalah yang saya alami, karena mereka hampir membuat saya gila.

kaolick
sumber
Sayangnya ini tidak berfungsi dengan SwiftKey versi 4 yang baru. Dan itu membuatku gila lagi ...: - /
kaolick
3
IF Anda salah. gunakan: 'event.getKeyCode () == KeyEvent.KEYCODE_ENTER'
Loda
Sempurna untukku. Juga ingat untuk memasukkan setImeActionLabel lagi dalam pernyataan IF jika tidak, teks kustom menghilang setelah pers pertama.
Steve Rogers
IF-nya benar, karena ia menetapkan actionId ke KeyEvent.KEYCODE_ENTER di atas :-D, tapi ya semua orang mungkin ingin menggunakan event.getKeyCode () == KeyEvent.KEYCODE_ENTER
Ray Hulha
15

Di xml Anda, tambahkan atribut imeOptions ke editText

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

Kemudian, dalam kode Java Anda, tambahkan OnEditorActionListener ke EditText yang sama

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

Berikut ini penjelasannya - ImeOptions = actionDone akan menetapkan "actionDone" ke EnterKey. EnterKey di keyboard akan berubah dari "Enter" ke "Done". Jadi ketika Enter Key ditekan, itu akan memicu tindakan ini dan dengan demikian Anda akan menanganinya.

TABUT
sumber
9

Anda juga bisa melakukannya ..

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;
        }
    });
Zar E Ahmer
sumber
Untuk beberapa alasan ketika saya mengklik enterdi teks edit saya, seluruh teks edit bergerak ke bawah ... Bagaimana saya bisa memperbaikinya?
Ruchir Baronia
Saya pikir Anda ingin belajar stackoverflow.com/questions/10978038/... tunjukkan juga xml Anda
Zar E Ahmer
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;
        }
    });

Bekerja sangat baik untuk saya.
Selain itu sembunyikan keyboard

Vlad
sumber
5

Pertama, Anda harus mengatur EditText mendengarkan tekan tombol

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

}

Kedua, tentukan acara dengan menekan tombol, misalnya, acara untuk mengatur teks 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;   

}

Dan akhirnya, jangan lupa untuk mengimpor EditText, TextView, OnKeyListener, KeyEvent di atas:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;
LifeiSHot
sumber
5

bekerja dengan sempurna

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

        }
    });
}

}

bekerja dengan sempurna

Domi mtz
sumber
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" />
Kreker
sumber
4

Ini seharusnya bekerja

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!");
                    }
           }
          });
ORY
sumber
4

Ketikkan kode ini di editor Anda sehingga dapat mengimpor modul yang diperlukan.

 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;
        }
    });
Sanjit Prasad
sumber
query = Nama bidang EditText, dan juga tambahkan ini -> (android: imeOptions = "actionSearch") dalam xml dari EditText.
Sanjit Prasad
3

Ini berfungsi dengan baik pada ponsel Android LG. Ini mencegah ENTERdan karakter khusus lainnya ditafsirkan sebagai karakter normal. Nextatau Donetombol muncul secara otomatis dan ENTERberfungsi seperti yang diharapkan.

edit.setInputType(InputType.TYPE_CLASS_TEXT);
Milan Švec
sumber
Ini adalah SATU-SATUNYA hal yang berhasil untuk saya. Saya memiliki Motorola Moto X 2 dan biasanya memiliki kunci "Kembali" dengan panah dan segalanya. Ini mengubahnya menjadi tanda centang dan saya akhirnya bisa membuat pendengar bekerja dengan itu. (Sebelum itu baru saja membuat baris baru). Jadi, jika ada orang lain yang mengalami masalah itu ...
mystic cola
2

Berikut adalah fungsi statis sederhana yang dapat Anda lemparkan ke dalam Utilsatau Keyboardskelas Anda yang akan mengeksekusi kode ketika pengguna menekan tombol kembali pada keyboard perangkat keras atau perangkat lunak. Ini adalah versi modifikasi dari jawaban luar biasa @ 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;
        }
    };
}
JohnnyLambada
sumber
Perhatikan bahwa ini menggunakan ekspresi lambda yang membutuhkan Java 1.8, tetapi cukup mudah untuk mengubahnya agar tidak menggunakan lambda. Namun, masalah yang saya lihat dengan solusi jenis ini adalah keyboard virtual tidak sembunyi otomatis, dan jika dalam mode layar penuh (perangkat kecil dalam orientasi lanskap), mode layar penuh tidak mati setelah pengguna menekan Enter atau DONE
jk7
2

InputType pada bidang teks harus textsesuai dengan apa yang dikatakan CommonsWare berfungsi. Baru saja mencoba semua ini, tidak ada inputType sebelum persidangan dan tidak ada yang berhasil, Enter terus mendaftar sebagai soft enter. Setelah inputType = text, semuanya termasuk setImeLabel berfungsi.

Contoh: android:inputType="text"

Odaym
sumber
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;
        }
    });
Brinda Rathod
sumber
1

Cara yang dapat diandalkan untuk merespons <enter> dalam EditText adalah dengan TextWatcher , LocalBroadcastManager , dan BroadcastReceiver . Anda perlu menambahkan perpustakaan dukungan v4 untuk menggunakan LocalBroadcastManager. Saya menggunakan tutorial di vogella.com : 7.3 "Acara siaran lokal dengan LocalBroadcastManager" karena contoh kode ringkas lengkapnya. Dalam onTextChanged before adalah indeks akhir dari perubahan sebelum perubahan >; minus mulai. Ketika di TextWatcher utas UI sedang sibuk memperbarui editTeks yang dapat diedit, jadi kami mengirim Intent untuk membangunkan BroadcastReceiver ketika utas UI selesai memperbarui 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
earlcasper
sumber
Jika menggunakan salah satu dari jenis input teks * (mis. android:inputType="textCapSentences") Maka carriage-return disaring keluar dari input sehingga onTextChanged () tidak dipanggil ketika pengguna menekan tombol Enter.
jk7
1

Pertanyaan ini belum dijawab dengan Butterknife

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

APP JAWA

@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;
}
Seseorang disuatu tempat
sumber
TextInputLayout dan Butterknife: MENANG!
Javi
1

Menggunakan Kotlin, saya telah membuat fungsi yang menangani semua jenis tindakan "selesai" seperti untuk EditText, termasuk keyboard, dan dimungkinkan untuk memodifikasinya dan juga menangani tombol lain sesuai keinginan:

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

Jadi, penggunaan sampel:

        editText.setOnDoneListener({
            //do something
        })

Adapun untuk mengubah label, saya pikir itu tergantung pada aplikasi keyboard, dan biasanya hanya berubah pada landscape, seperti yang tertulis di sini . Bagaimanapun, contoh penggunaan untuk ini:

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

Atau, jika Anda ingin dalam XML:

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

Dan hasilnya (ditampilkan dalam lanskap):

masukkan deskripsi gambar di sini

pengembang android
sumber
0

Tambahkan dependen ini, dan itu harus bekerja:

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
Jacky Supit
sumber
0

Ini akan memberi Anda fungsi yang bisa dipanggil saat pengguna menekan tombol kembali.

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

Pemakaian

editText.setLineBreakListener {
    doSomething()
}
Michael
sumber