Android Düğmeye tıklamak için Klavye üzerindeki Bitti düğmesini kullanın


131

Tamam uygulamamda kullanıcının bir sayı girmesi için bir alanım var. Alanı yalnızca sayıları kabul edecek şekilde ayarladım. Kullanıcı alana tıkladığında klavyeyi ekrana getirir. Klavyede (ICS'de) bir tamam düğmesi var. Klavyedeki tamamlandı düğmesinin başvurumdaki gönder düğmesini tetiklemesini istiyorum. Kodum aşağıdaki gibidir.

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


        }
    }

};

}


Bu, metin kutusu güncellemesini ifade eder.
mpeerman

Yapmak istediğim şey, zaten sahip olduğum bir düğmeyi tetiklemek. Düğmeden kurtulmak istemiyorum çünkü bazı insanlar tamam düğmesi olmayan klavyeler kullanıyor olabilir.
mpeerman

Yanıtlar:


313

Bunu da kullanabilirsiniz (Metin Düzeninde bir eylem gerçekleştirildiğinde çağrılacak özel bir dinleyici ayarlar), hem DONE hem de RETURN için çalışır:

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
Bunu, gönder düğmesini zaten kapatıyorum. Public void onClick (Görüntüle) {
mpeerman

3
Tüm bu kodu tek işleve taşıyabilir ve sonra çağırabilir veya performClick ()
vladexologija

6
Bu, bir DONE düğmesine basıldığında benim için işe yaramadı, KeyEvent her zaman boştu .. ancak actionId, EditorInfo.IME_ACTION_DONE olarak ayarlandı ve bunun yerine onu kullanabildim. (Bu, android 4.2.2 sürümündedir ve şu anda android sdk belgelerine bile uymamaktadır)
James

28

İle deneyebilirsiniz IME_ACTION_DONE.

Bu eylem hiçbir şey girilmeden "tamamlandı" işlemi gerçekleştirir ve IME kapatılır.

 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
Bu benim için mükemmel çalışıyor. DOĞRU dönüşü konusunda dikkatli olun. Klavye görüntülenmeye devam ediyor. Klavyeyi gizlemek istiyorsanız YANLIŞ'a dönün.
Matwosk

1
Mücevher gibi çalışır!
sam

16

Bunu dene:

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

Herhangi bir düğmeye bastığınızda, görünümünüz onKey olayını oluşturur ve keyCode sağ düğmeyle eşleştiğinde istediğiniz bir şeyi yapar
Roman Black

1
düğme odaklanmalı
Jeffrey Blattman

8

Bunu Xamarin.Android (Çapraz Platform) için deneyin

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

7

Kotlin Çözümü

Kotlin'de yapılan eylemi halletmenin temel yolu şudur:

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

Kotlin Uzantısı

edittext.onDone {/*action*/}Ana kodunuzu aramak için bunu kullanın . Daha okunaklı ve sürdürülebilir tutar

edittext.onDone { submitForm() }

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

Bu seçenekleri edittext dosyanıza eklemeyi unutmayın

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

inputType="textMultiLine"Desteğe ihtiyacınız varsa , bu yazıyı okuyun


4

LoginActivity oluşturduğunuzda aşağıdaki kodu AndroidStudio'dan kopyaladım. İme özniteliklerini kullanıyorum

Senin düzeninde

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

Aktivitenizde

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

Anahtar dinleyiciye uygulayabilirsiniz:

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

OnCreate'te:

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

Tuş tıklaması gibi herhangi bir olay ile yapmak istediğiniz işinizi yapmak için klavye giriş butonunu yakalamak isterseniz, o metin görünümü için aşağıdaki basit kodu yazabilirsiniz.

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

Kotlin ve Sayısal klavye

Sayısal klavyeyi kullanıyorsanız, klavyeyi kapatmanız gerekir, şöyle olacaktır:

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

Bu sınıfı düzeninizde kullanın:

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

}

Xml olarak:

<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
Kodunuz hakkında yorum yapmak her zaman bir cevabın okunabilirliğini artırır ...
jAC

Bu kod soruyu yanıtlayabilirken, sorunu nasıl ve / veya neden çözdüğüne ilişkin ek bağlam sağlamak , yanıtlayanın uzun vadeli değerini artıracaktır. Sadece şimdi soran kişi değil, gelecekte okuyucular için soruyu yanıtladığınızı unutmayın! Lütfen bir açıklama eklemek için cevabınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğuna dair bir gösterge verin. Ayrıca bu cevabın neden diğerlerinden daha uygun olduğunu belirtmekten de zarar gelmez.
Dev-iL

0

Last Edittext .setOnEditorActionListener'ınız bu yöntemi otomatik isabet api olarak çağırır

Et_password içinde LoginActivity'de Çağrı yapıyordum

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

İyi çalışıyor


0

Ve bu bir Kotlin versiyonu:

editText.setOnEditorActionListener { v, actionId, event ->
  if(actionId == EditorInfo.IME_ACTION_DONE){
      //Put your action there
      true
  } else {
      false
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.