Android Użyj przycisku Gotowe na klawiaturze, aby kliknąć przycisk


132

Ok w mojej aplikacji mam pole do wpisania liczby przez użytkownika. Mam ustawione pole, aby akceptować tylko liczby. Kiedy użytkownik kliknie to pole, wyświetla klawiaturę. Na klawiaturze (na ICS) znajduje się przycisk gotowe. Chciałbym, aby przycisk Gotowe na klawiaturze uruchamiał przycisk przesyłania, który mam w mojej aplikacji. Mój kod jest następujący.

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


        }
    }

};

}


To odnosi się do aktualizacji pola tekstowego.
mpeerman

To, co chcę zrobić, to również uruchomić przycisk, który już mam. Nie chcę pozbywać się przycisku, ponieważ niektórzy ludzie mogą używać klawiatur, które nie mają przycisku Gotowe.
mpeerman

Odpowiedzi:


318

Możesz również użyć tego (ustawia specjalny detektor, który ma być wywoływany, gdy akcja jest wykonywana na EditText), działa zarówno dla DONE, jak i 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
Jak mogę ustawić to tak, aby uruchamiało kliknięcie, które już mam, gdy kończy się przycisk przesyłania, publiczne nieważne onClick (widok widoku) {
mpeerman

3
Możesz albo przenieść cały kod do jednej funkcji, a następnie wywołać ją lub użyć performClick ()
vladexologija

6
To nie zadziałało po naciśnięciu przycisku DONE, KeyEvent zawsze było zerowe .. actionId był jednak ustawiony na EditorInfo.IME_ACTION_DONE i zamiast tego mogłem go użyć. (To jest w systemie Android 4.2.2 i nie pasuje nawet do dokumentacji zestawu SDK systemu Android)
James

28

Możesz spróbować IME_ACTION_DONE.

Ta akcja wykonuje operację „gotową” bez wprowadzania danych, a edytor IME zostanie zamknięty.

 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
Ten działa idealnie dla mnie. Uważaj na zwrot TRUE. Klawiatura pozostaje wyświetlona. Jeśli chcesz ukryć klawisz powrotu FALSE.
Matwosk

1
Działa jak klejnot!
sam

16

Spróbuj tego:

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

Po naciśnięciu dowolnego przycisku widok generuje zdarzenie onKey, a gdy kod keyCode jest dopasowany do prawego przycisku, robi coś, co chcesz
Roman Black

1
button musi być skupiony
Jeffrey Blattman

10

Rozwiązanie Kotlin

Podstawowy sposób obsługi wykonanej akcji w Kotlinie to:

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

Rozszerzenie Kotlin

Użyj tego, aby wywołać edittext.onDone {/*action*/}swój główny kod. Sprawia, że ​​jest bardziej czytelny i łatwy w utrzymaniu

edittext.onDone { submitForm() }

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

Nie zapomnij dodać tych opcji do swojego pliku edittext

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

Jeśli potrzebujesz inputType="textMultiLine"wsparcia, przeczytaj ten post


8

Wypróbuj to dla platformy Xamarin.Android (między platformami)

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

4

Skopiowałem następujący kod z AndroidStudio podczas tworzenia LoginActivity. Używam atrybutów ime

W twoim układzie

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

W Twojej aktywności

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

Możesz zaimplementować na key listener:

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

W 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

jeśli chcesz złapać klawisz Enter na klawiaturze, aby wykonać swoją pracę, którą chcesz wykonać za pomocą dowolnego zdarzenia, takiego jak kliknięcie przycisku, możesz napisać poniższy prosty kod dla tego widoku tekstu

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 i klawiatura numeryczna

Jeśli używasz klawiatury numerycznej, musisz odrzucić klawiaturę, będzie to wyglądać następująco:

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

Użyj tej klasy w swoim układzie:

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

}

W 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
Komentowanie kodu zawsze poprawia czytelność odpowiedzi ...
jAC

Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a nie tylko osoba, która zapyta teraz! Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, i dać wskazówkę co zastosować ograniczenia i założenia. Nie zaszkodzi też wspomnieć, dlaczego ta odpowiedź jest bardziej odpowiednia niż inne.
Dev-iL

0

Twój Last Edittext .setOnEditorActionListener wywołuje tę metodę automatycznego hit api

Byłem Call in LoginActivity w 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;
            }
        });

Pracować w porządku


0

A to jest wersja Kotlin:

editText.setOnEditorActionListener { v, actionId, event ->
  if(actionId == EditorInfo.IME_ACTION_DONE){
      //Put your action there
      true
  } else {
      false
  }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.