Android Verwenden Sie die Schaltfläche Fertig auf der Tastatur, um auf die Schaltfläche zu klicken


131

Ok, in meiner App habe ich ein Feld, in das der Benutzer eine Nummer eingeben kann. Ich habe das Feld so eingestellt, dass nur Zahlen akzeptiert werden. Wenn der Benutzer auf das Feld klickt, wird die Tastatur aufgerufen. Auf der Tastatur (auf ICS) befindet sich eine Schaltfläche "Fertig". Ich möchte, dass die Schaltfläche "Fertig" auf der Tastatur die Schaltfläche "Senden" auslöst, die ich in meiner Anwendung habe. Mein Code lautet wie folgt.

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


        }
    }

};

}


Das bezieht sich auf die Aktualisierung des Textfelds.
Mpeerman

Was ich tun möchte, ist, dass es auch einen Knopf auslöst, den ich bereits habe. Ich möchte den Knopf nicht loswerden, weil einige Leute möglicherweise Tastaturen verwenden, die keinen erledigten Knopf haben.
Mpeerman

Antworten:


313

Sie können diesen auch verwenden (legt einen speziellen Listener fest, der aufgerufen wird, wenn eine Aktion im EditText ausgeführt wird). Er funktioniert sowohl für DONE als auch für RETURN:

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
Wie kann ich es einstellen , die auf auszulösen klicke ich bereits von der Submit - Button public void onClick (Ansicht Ansicht) {wegzulaufen
mpeerman

3
Sie können entweder den gesamten Code in eine einzelne Funktion verschieben und ihn dann aufrufen oder performClick ()
vladexologija

6
Dies funktionierte bei mir nicht, wenn ich auf die Schaltfläche FERTIG drückte. Das KeyEvent war immer null. Die Aktions-ID wurde jedoch auf EditorInfo.IME_ACTION_DONE gesetzt, und ich konnte sie stattdessen verwenden. (Dies ist in Android 4.2.2 und entspricht nicht einmal der Android SDK-Dokumentation zu diesem Zeitpunkt)
James

28

Sie können mit versuchen IME_ACTION_DONE.

Diese Aktion führt eine "erledigt" -Operation aus, bei der nichts eingegeben werden kann, und der IME wird geschlossen.

 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
Dieser funktioniert perfekt für mich. Seien Sie vorsichtig bei der Rückgabe von TRUE. Die Tastatur bleibt angezeigt. Wenn Sie die Tastatur ausblenden möchten, geben Sie FALSE zurück.
Matwosk

1
Funktioniert wie ein Juwel!
Sam

16

Versuche dies:

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

Wenn Sie eine beliebige Taste drücken, generiert Ihre Ansicht ein Ereignis auf dem Schlüssel, und wenn keyCode mit der rechten Taste übereinstimmt, wird etwas getan, das Sie möchten
Roman Black

1
Knopf muss Fokus haben
Jeffrey Blattman

8

Versuchen Sie dies für Xamarin.Android (Cross Platform)

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

6

Kotlin-Lösung

Die grundlegende Methode, um die in Kotlin durchgeführten Aktionen auszuführen, ist:

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

Kotlin-Erweiterung

Verwenden Sie diese Option, um edittext.onDone {/*action*/}Ihren Hauptcode aufzurufen . Hält es lesbarer und wartbarer

edittext.onDone { submitForm() }

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

Vergessen Sie nicht, diese Optionen Ihrem Edittext hinzuzufügen

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

Wenn Sie inputType="textMultiLine"Unterstützung benötigen , lesen Sie diesen Beitrag


4

Ich habe den folgenden Code von AndroidStudio kopiert, als Sie eine LoginActivity erstellt haben. Ich benutze die IME-Attribute

In Ihrem Layout

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

In Ihrer Aktivität

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

Sie können auf Key Listener implementieren:

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

In 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

Wenn Sie die Tastatureingabetaste für Ihre Arbeit abrufen möchten, die Sie durch ein Ereignis wie das Klicken auf eine Schaltfläche ausführen möchten, können Sie den folgenden einfachen Code für diese Textansicht schreiben

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 und Zifferntastatur

Wenn Sie die numerische Tastatur verwenden, müssen Sie die Tastatur schließen.

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

Verwenden Sie diese Klasse in Ihrem Layout:

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

}}

In 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
Das Kommentieren Ihres Codes verbessert immer die Lesbarkeit einer Antwort ...
jAC

Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt! Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, und geben Sie an, welche Einschränkungen und Annahmen gelten. Es tut auch nicht weh zu erwähnen, warum diese Antwort angemessener ist als andere.
Dev-iL

0

Ihr letzter Edittext .setOnEditorActionListener ruft diese Methode automatisch auf

Ich war Call in LoginActivity in 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;
            }
        });

Funktioniert gut


0

Und das ist eine Kotlin-Version:

editText.setOnEditorActionListener { v, actionId, event ->
  if(actionId == EditorInfo.IME_ACTION_DONE){
      //Put your action there
      true
  } else {
      false
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.