Android Gunakan tombol Selesai pada Keyboard untuk mengklik tombol

131

Oke di aplikasi saya, saya memiliki bidang bagi pengguna untuk memasukkan nomor. Saya menetapkan bidang hanya menerima angka. Ketika pengguna mengklik bidang itu menampilkan keyboard. Pada keyboard (pada ICS) ada tombol yang dilakukan. Saya ingin tombol selesai pada keyboard untuk memicu tombol kirim yang saya miliki di aplikasi saya. Kode saya adalah sebagai berikut.

package com.michaelpeerman.probability;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;

public class ProbabilityActivity extends Activity implements OnClickListener {

private Button submit;
ProgressDialog dialog;
int increment;
Thread background;
int heads = 0;
int tails = 0;

public void onCreate(Bundle paramBundle) {
    super.onCreate(paramBundle);
    setContentView(R.layout.main);
    submit = ((Button) findViewById(R.id.submit));
    submit.setOnClickListener(this);
}

public void onClick(View view) {
    increment = 1;
    dialog = new ProgressDialog(this);
    dialog.setCancelable(true);
    dialog.setMessage("Flipping Coin...");
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    dialog.setProgress(0);
    EditText max = (EditText) findViewById(R.id.number);
    int maximum = Integer.parseInt(max.getText().toString());
    dialog.setMax(maximum);
    dialog.show();
    dialog.setOnCancelListener(new OnCancelListener(){

          public void onCancel(DialogInterface dialog) {

              background.interrupt();
              TextView result = (TextView) findViewById(R.id.result);
                result.setText("heads : " + heads + "\ntails : " + tails);


          }});


    background = new Thread(new Runnable() {
        public void run() {
            heads=0;
            tails=0;
            for (int j = 0; !Thread.interrupted() && j < dialog.getMax(); j++) {
                int i = 1 + new Random().nextInt(2);
                if (i == 1)
                    heads++;
                if (i == 2)
                    tails++;
                progressHandler.sendMessage(progressHandler.obtainMessage());
            }
        }
    });
    background.start();
}

Handler progressHandler = new Handler() {
    public void handleMessage(Message msg) {

        dialog.incrementProgressBy(increment);
        if (dialog.getProgress() == dialog.getMax()) {
            dialog.dismiss();
            TextView result = (TextView) findViewById(R.id.result);
            result.setText("heads : " + heads + "\ntails : " + tails);


        }
    }

};

}
mpeerman
sumber
Itu mengacu pada pembaruan kotak teks.
mpeerman
Yang ingin saya lakukan adalah untuk itu juga memicu tombol yang sudah saya miliki. Saya tidak ingin menyingkirkan tombol karena beberapa orang mungkin menggunakan keyboard yang tidak memiliki tombol selesai.
mpeerman

Jawaban:

313

Anda dapat menggunakan ini juga (menetapkan pendengar khusus untuk dipanggil ketika tindakan dilakukan pada EditText), ini berfungsi baik untuk DILAKUKAN dan KEMBALI:

max.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
                Log.i(TAG,"Enter pressed");
            }    
            return false;
        }
    });
vladexologija
sumber
1
Bagaimana saya dapat mengaturnya untuk memicu klik saat saya sudah kehabisan tombol kirim public void onClick (Tampilan tampilan) {
mpeerman
3
Anda dapat memindahkan semua kode itu ke dalam satu fungsi dan kemudian memanggilnya atau menggunakan performClick ()
vladexologija
6
Ini tidak berfungsi untuk saya ketika menekan tombol DONE, KeyEvent selalu null .. namun actionId diatur ke EditorInfo.IME_ACTION_DONE dan saya dapat menggunakannya sebagai gantinya. (Ini di android 4.2.2 dan bahkan tidak cocok dengan dokumentasi SDK android saat ini)
James
28

Anda bisa mencobanya IME_ACTION_DONE.

Tindakan ini melakukan operasi "selesai" tanpa input apa pun dan IME akan ditutup.

 Your_EditTextObj.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                  /* Write your logic here that will be executed when user taps next button */


                    handled = true;
                }
                return handled;
            }
        });
IntelliJ Amiya
sumber
8
Yang ini sangat cocok untuk saya. Hati-hati mengembalikan TRUE. Keyboard tetap ditampilkan. Jika Anda ingin menyembunyikan kembali keyboard SALAH.
Matwosk
1
Bekerja seperti permata!
sam
16

Coba ini:

max.setOnKeyListener(new OnKeyListener(){
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event){
        if(keyCode == event.KEYCODE_ENTER){
            //do what you want
        }
    }
});
Roman Black
sumber
Ketika Anda menekan tombol apa saja, tampilan Anda menghasilkan event onKey, dan ketika keyCode cocok dengan tombol kanan, ia melakukan sesuatu yang Anda inginkan
Roman Black
1
tombol harus memiliki fokus
Jeffrey Blattman
8

Coba ini untuk Xamarin. Android (Cross Platform)

edittext.EditorAction += (object sender, TextView.EditorActionEventArgs e) {
       if (e.ActionId.Equals (global::Android.Views.InputMethods.ImeAction.Done)) {
           //TODO Something
       }
};
Nitin V. Patil
sumber
7

Solusi Kotlin

Cara dasar untuk menangani tindakan yang dilakukan di Kotlin adalah:

edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Call your code here
        true
    }
    false
}

Perpanjangan Kotlin

Gunakan ini untuk memanggil edittext.onDone {/*action*/}kode utama Anda. Menjaga agar lebih mudah dibaca dan dipelihara

edittext.onDone { submitForm() }

fun EditText.onDone(callback: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

Jangan lupa untuk menambahkan opsi ini ke edittext Anda

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

Jika Anda memerlukan inputType="textMultiLine"dukungan, baca posting ini

Gibolt
sumber
4

Saya menyalin kode berikut dari AndroidStudio ketika Anda membuat LoginActivity. Saya menggunakan atribut ime

Dalam tata letak Anda

<EditText android:id="@+id/unidades" android:layout_width="match_parent"
                    android:layout_height="wrap_content" android:hint="@string/prompt_unidades"
                    android:inputType="number" android:maxLines="1"
                    android:singleLine="true"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:enabled="true" android:focusable="true"
                    android:gravity="right"
                    android:imeActionId="@+id/cantidad"
                    android:imeActionLabel="@string/add"
                    android:imeOptions="actionUnspecified"/>

Dalam Aktivitas Anda

editTextUnidades.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == R.id.cantidad || actionId == EditorInfo.IME_NULL) {
                addDetalle(null);
                return true;
            }
            return false;
        }
    });
Juan Rojas
sumber
2

Anda dapat menerapkan pada pendengar kunci:

public class ProbabilityActivity extends Activity implements OnClickListener, View.OnKeyListener {

Di onCreate:

max.setOnKeyListener(this);

...

@Override
public boolean onKey(View v, int keyCode, KeyEvent event){
    if(keyCode == event.KEYCODE_ENTER){
        //call your button method here
    }
    return true;
}
Timah
sumber
1

jika Anda ingin menangkap tombol enter keyboard untuk melakukan pekerjaan Anda yang ingin Anda lakukan melalui peristiwa seperti klik tombol, Anda dapat menulis kode sederhana di bawah ini untuk tampilan teks

Edittext ed= (EditText) findViewById(R.id.edit_text);

ed.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Do you job here which you want to done through event
    }
    return false;
}
});
Nadeem Bhat
sumber
1

Keyboard Kotlin dan Numeric

Jika Anda menggunakan keyboard numerik Anda harus mengabaikan keyboard, itu akan seperti:

editText.setOnEditorActionListener { v, actionId, event ->
  if (action == EditorInfo.IME_ACTION_DONE || action == EditorInfo.IME_ACTION_NEXT || action == EditorInfo.IME_ACTION_UNSPECIFIED) {
      //hide the keyboard
      val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
      imm.hideSoftInputFromWindow(windowToken, 0)
      //Take action
      editValue.clearFocus()
      return true
  } else {
      return false
  }
}
Jackson Dias da Silva
sumber
0

Gunakan kelas ini di tata letak Anda:

public class ActionEditText extends EditText
{
    public ActionEditText(Context context)
    {
        super(context);
    }

    public ActionEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ActionEditText(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs)
    {
        InputConnection conn = super.onCreateInputConnection(outAttrs);
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        return conn;
    }

}

Dalam xml:

<com.test.custom.ActionEditText
                android:id="@+id/postED"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:gravity="top|left"
                android:hint="@string/msg_type_message_here"
                android:imeOptions="actionSend"
                android:inputType="textMultiLine"
                android:maxLines="5"
                android:padding="5dip"
                android:scrollbarAlwaysDrawVerticalTrack="true"
                android:textColor="@color/white"
                android:textSize="20sp" />
Yogendra
sumber
0
max.setOnKeyListener(new OnKeyListener(){
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event){
    if(keyCode == event.KEYCODE_ENTER){
        //do what you want
    }
  }
});
RkKhanpuriya
sumber
1
Mengomentari kode Anda selalu meningkatkan keterbacaan jawaban ...
jAC
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang! Harap edit jawaban Anda untuk menambahkan penjelasan, dan berikan indikasi batasan dan asumsi apa yang berlaku. Tidak ada salahnya untuk menyebutkan mengapa jawaban ini lebih tepat daripada yang lain.
Dev-iL
0

Edittext Terakhir Anda .setOnEditorActionListener memanggil metode ini secara otomatis mengenai api

Saya adalah Call in LoginActivity di et_password

 et_Pass.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {

                    Log.i(TAG,"Enter pressed");
                    Log.i(Check Internet," and Connect To Server");

                }
                return false;
            }
        });

Bekerja dengan baik

Keshav Gera
sumber
0

Dan ini adalah versi Kotlin:

editText.setOnEditorActionListener { v, actionId, event ->
  if(actionId == EditorInfo.IME_ACTION_DONE){
      //Put your action there
      true
  } else {
      false
  }
}
iluxa.b
sumber