"Kirim" tersirat setelah menekan Selesai di keyboard di EditText terakhir

Jawaban:

185

Coba ini:

Dalam tata letak Anda, letakkan / edit ini:

<EditText
    android:id="@+id/search_edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="text"
    android:singleLine="true"
    android:imeOptions="actionDone" />

Dalam aktivitas Anda, letakkan ini (misalnya di onCreate):

 // your text box
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });

Di mana submit_btntombol kirim Anda dengan pengendali onclick Anda terpasang.

Hariharan
sumber
15
submit_btn.performClick();sedang membakar mataku. Srsly? Mengapa tidak memanggil metode kirim?
Laurent Meyer
28
@LaurentMeyer Mensimulasikan input pengguna biasanya lebih baik daripada langsung memanggil logika yang mendasarinya dalam situasi ini. Misalnya, tombol kirim mungkin dinonaktifkan saat ini, jadi performClick () tidak akan melakukan apa pun (seperti yang diinginkan), tetapi jika Anda memanggil metode kirim secara langsung, Anda harus memeriksa bahwa tombol tersebut tidak dinonaktifkan terlebih dahulu. Ini juga akan memainkan suara "klik" seolah-olah tombol diketuk, dll.
Extragorey
3
@LaurentMeyer Apa yang Anda maksud dengan UI sensitif? Dan 5 orang dalam 6 bulan terakhir, tentu. Beri mereka waktu dan orang-orang mungkin akan setuju dengan saya juga. ;)
Extragorey
Mari kita pertimbangkan bahwa Anda mengubah UI, yang menggunakan tombol untuk hal lain. Kode akan menjadi sangat berantakan dan lebih buruk lagi, Anda harus memiliki prosedur pengujian yang sangat ekstensif untuk mendeteksi bug semacam itu. Lebih buruk lagi adalah ketika Anda membagikan komponen UI dengan praktik semacam itu.
Laurent Meyer
1
TWIMC, menggunakan imeActionLabelEditText saya telah menonaktifkan semua perilaku ini. Awas
Alwin Kesler
25

Anda perlu mengatur Opsi IME di EditText.

<EditText
    android:id="@+id/some_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Whatever"
    android:inputType="text"
    android:imeOptions="actionDone" />

Kemudian tambahkan OnEditorActionListenerke tampilan untuk mendengarkan tindakan "selesai".

EditText editText = (EditText) findViewById(R.id.some_view);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // TODO do something
            handled = true;
        }
        return handled;
    }
});

Dokumen API resmi: https://developer.android.com/guide/topics/ui/controls/text.html#ActionEvent

flx
sumber
22

Solusi sederhana dan efektif dengan Kotlin

Perpanjang EditText:

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->

       if (actionId == EditorInfo.IME_ACTION_DONE) {
           func()
       }

       true

    }
}

Kemudian gunakan metode baru seperti ini:

editText.onSubmit { submit() }

Dimana submit()sesuatu seperti ini:

fun submit() {
    // call to api
}

Ekstensi yang lebih umum

fun EditText.on(actionId: Int, func: () -> Unit) {
    setOnEditorActionListener { _, receivedActionId, _ ->

       if (actionId == receivedActionId) {
           func()
       }

        true
    }
}

Dan kemudian Anda dapat menggunakannya untuk mendengarkan acara Anda:

email.on(EditorInfo.IME_ACTION_NEXT, { confirm() })
Francesco Donzello
sumber
6

Beginilah cara melakukannya

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

Jangan lupa tambahkan

<EditText android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:imeOptions="actionDone"/>

actionDone di EditText Anda.

Jitender Dev
sumber
2

Dalam file XML Anda di dalam tag edittext Anda tambahkan cuplikan di bawah ini

android:imeOptions="actionDone"

Kemudian di dalam kelas Java Anda, tulis kode di bawah ini

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() { 


@Override 
  public boolean onEditorAction(TextView v, int id, KeyEvent event) { 
   if (id == EditorInfo.IME_ACTION_DONE) { 
      //do your work here 
      return true;
    } 

        return false; 
   } 
  });
Madhu Kumar
sumber
1

tambahkan baris berikut di edittext

android:imeOptions="actionDone"

Selamat membuat kode

Senthil JS
sumber
1
etParola = (EditText) findViewById(R.id.etParola); 
 btnGiris = (Button) findViewById(R.id.btnGiris);
  etParola.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    btnGiris.performClick();
                    return true;
                }
                return false;
            }
        });

 and;


layout xml etParola
android:imeOptions="actionDone" add
Rabia Aydoğdu
sumber
Ini jawaban yang persis sama dengan yang ini . Anda harus menjelaskan sedikit bagaimana menurut Anda ini menyelesaikan masalah OP.
Adrian W
1

Perluas saja jawaban ini

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            clearFocus() // if needed 
            hideKeyboard()
            func()
        }
        true
    }
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}
bitvale
sumber
0
<EditText
        android:id="@+id/signinscr_userName"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/userName"
        android:imeOptions="actionNext" />

    <EditText
        android:id="@+id/signinscr_password"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionDone"
        android:inputType="textPassword" />

di file .java

EditText userNameField = (EditText) findViewById(R.id.signinscr_userName);
    EditText passwordField = (EditText) findViewById(R.id.signinscr_password);
    passwordField.setOnEditorActionListener(new OnEditorActionListener() {
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
            //Do your operation here.
            return false;
        }
    });
Amit Gupta
sumber
0
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
// which is u had set a imeoption
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });
Divyesh Kevadiya
sumber