使用Android键盘上的“完成”按钮点击按钮

148

在我的应用程序中,我有一个字段供用户输入数字。我已将该字段设置为仅接受数字。当用户单击该字段时,它会弹出键盘。在键盘上(在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
请查看此链接:https://dev59.com/PVXTa4cB1Zd3GeqP0EmW - Nishant
这指的是文本框更新。 - mpeerman
我想要做的是让它触发我已经有的按钮。我不想去掉这个按钮,因为有些人可能正在使用没有完成按钮的键盘。 - mpeerman
可能是Android检测OnScreen键盘上的Done按键的重复问题。 - Elltz
13个回答

343

您也可以使用这个(设置一个特殊的监听器,当在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;
        }
    });

此外,在键盘本身中显示一个漂亮的发送按钮会更好。请在EditText xml中添加以下行:

android:imeOptions="actionSend"
android:inputType="text"

1
我该如何设置它以触发我已经在提交按钮上运行的单击事件 public void onClick(View view) { - mpeerman
3
你可以将所有的代码移到一个函数中并调用它,或者使用 performClick() - vladexologija
6
当我点击“完成”按钮时,这种方法对我不起作用,KeyEvent总是为空的。但是actionId被设置为EditorInfo.IME_ACTION_DONE,我可以使用它代替。(这是在Android 4.2.2上,并且甚至不符合当时的Android SDK文档)。 - James

30

您可以尝试使用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;
            }
        });

9
对我来说这个很完美。注意返回TRUE时键盘仍会保持显示状态,如果你想隐藏键盘就要返回FALSE。 - Matwosk
1
运行得非常流畅! - vss

29

Kotlin解决方案

在Kotlin中处理done操作的基本方法是:

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中

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>
如果您需要支持inputType="textMultiLine",请阅读此帖子

这个监听器实际上总是返回 false(Kotlin谜题 ;)),但没关系:我们通常希望键盘关闭。 - gmk57
@gmk57 尝试在if语句中添加一个else,并将其包含false。我认为你总是看到false,因为if语句设置了true,但然后直接流到下一行的false(if之外)。 - jj.

17

试试这个:

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
按钮必须拥有焦点。 - Jeffrey Blattman

8
尝试这个针对Xamarin.Android(跨平台)的解决方案。
edittext.EditorAction += (object sender, TextView.EditorActionEventArgs e) {
       if (e.ActionId.Equals (global::Android.Views.InputMethods.ImeAction.Done)) {
           //TODO Something
       }
};

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

Kotlin和数字键盘

如果您正在使用数字键盘,则必须关闭键盘,方法如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接