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


        }
    }

};

}


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

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

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

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

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


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

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

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

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

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

0
max.setOnKeyListener(new OnKeyListener(){
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event){
    if(keyCode == event.KEYCODE_ENTER){
        //do what you want
    }
  }
});

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


0

Dan ini adalah versi Kotlin:

editText.setOnEditorActionListener { v, actionId, event ->
  if(actionId == EditorInfo.IME_ACTION_DONE){
      //Put your action there
      true
  } else {
      false
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.