Android Використовуйте кнопку "Готово" на клавіатурі, щоб натиснути кнопку


131

Гаразд у моєму додатку у мене є поле для користувача, щоб ввести число. У мене поле встановлене лише для прийому чисел. Коли користувач натискає поле, він відкриває клавіатуру. На клавіатурі (на ICS) є зроблена кнопка. Я хотів би, щоб зроблена кнопка на клавіатурі запустила кнопку подання, яку я маю у своїй програмі. Мій код такий.

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


        }
    }

};

}

1
перевірити цей stackoverflow.com/questions/5330243/…
Nishant

Це стосується оновлення текстового поля.
mpeerman

Що я хочу зробити, це для нього теж запустити кнопку, яку я вже маю. Я не хочу позбутися від кнопки, тому що деякі люди можуть використовувати клавіатури, які не мають кнопку.
mpeerman

Відповіді:


313

Ви також можете використовувати цей (встановлює спеціальний слухач, який повинен викликатись, коли виконується дія в редакторі EditText), він працює як "ЗРОБАНО", так і "ПОВЕРНУТИ":

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
Як я можу встановити його, щоб викликати натискання у мене, у мене вже запущена кнопка "Відправити публічну недійсність onClick" (Перегляд подання) {
mpeerman

3
Ви можете або перемістити весь цей код в одну функцію, а потім викликати його або скористатися performClick ()
vladexologija

6
Це не спрацювало для мене під час натискання кнопки "ЗРОБАНО", KeyEvent завжди був недійсним. Однак діяId було встановлено на EditorInfo.IME_ACTION_DONE, і я міг використовувати це замість цього. (Це в android 4.2.2 і наразі навіть не відповідає документації на sdk для android)
Джеймс

28

Можна спробувати IME_ACTION_DONE.

Ця дія виконує операцію "зроблено", щоб нічого не вводити, і IME буде закрито.

 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
Цей ідеально підходить для мене. Будьте уважні до повернення ІСТИНА. Клавіатура залишається відображеною. Якщо ви хочете повернути клавіатуру, поверніть FALSE.
Матвоск

1
Працює як дорогоцінний камінь!
сам

16

Спробуйте це:

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

Коли ви натискаєте будь-яку кнопку, ваш погляд генерує подію onKey, а коли keyCode співпадає з правою кнопкою, вона робить те, що вам завгодно
Roman Black

1
кнопка повинна мати фокус
Джеффрі Блатман

8

Спробуйте це для Xamarin.Android (кросова платформа)

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

7

Рішення Котліна

Основний спосіб вчинити виконану дію в Котліні:

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

Розширення Kotlin

Використовуйте це для виклику edittext.onDone {/*action*/}у своєму головному коді. Зберігає її легше для читання та ремонтування

edittext.onDone { submitForm() }

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

Не забудьте додати ці параметри до свого редакційного тексту

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

Якщо вам потрібна inputType="textMultiLine"підтримка, прочитайте цю публікацію


4

Наступний код я скопіював з AndroidStudio, коли ви створюєте LoginActivity. Я використовую атрибути ime

У вашому макеті

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

У вашій діяльності

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

Ви можете реалізувати на ключовому слухачі:

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

У програмі 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

якщо ви хочете зафіксувати кнопку введення на клавіатурі для виконання своєї роботи, яку ви хочете виконати через будь-яку подію, наприклад, натискання кнопки, ви можете написати простий нижче код для цього перегляду тексту

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

Котлін і числова клавіатура

Якщо ви використовуєте цифрову клавіатуру, вам доведеться відхилити клавіатуру, це буде:

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

Використовуйте цей клас у своєму макеті:

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:

<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
Коментування коду завжди покращує читабельність відповіді ...
jAC

Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді. Пам’ятайте, що ви відповідаєте на запитання читачів у майбутньому, а не лише про людину, яка зараз запитує! Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються. Також не завадить згадати, чому ця відповідь доречніша за інші.
Dev-iL

0

Ваш останній Edittext .setOnEditorActionListener викликає цей метод автоматичним натисканням api

Мені було виклик в LoginActivity в 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;
            }
        });

Робочий штраф


0

А це версія Котліна:

editText.setOnEditorActionListener { v, actionId, event ->
  if(actionId == EditorInfo.IME_ACTION_DONE){
      //Put your action there
      true
  } else {
      false
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.