我想知道是否有一种方法来处理用户在输入EditText时按下Enter,就像onSubmit HTML事件。

还想知道是否有一种方法来操纵虚拟键盘,以这样的方式,“完成”按钮被标记为其他的东西(例如“Go”),并在单击时执行特定的动作(再次,像onSubmit)。


当前回答

你应该这样做。它也隐藏在Android开发者的样例代码“蓝牙聊天”中。用你自己的变量和方法替换“example”的粗体部分。

首先,把你需要的东西导入到主Activity中,你想让返回按钮做一些特殊的事情:

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

现在,创建一个类型为TextView的变量。OnEditorActionListener作为返回键(这里我使用exampleListener);

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

然后,您需要告诉侦听器当按下返回按钮时该做什么。它需要知道我们谈论的EditText是什么(这里我使用exampleView),然后它需要知道当按下Enter键时要做什么(这里是example_confirm())。如果这是活动中最后一个或唯一一个EditText,它应该做与提交(或确定,确认,发送,保存等)按钮的onClick方法相同的事情。

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

最后,设置监听器(很可能在你的onCreate方法中);

exampleView.setOnEditorActionListener(exampleListener);

其他回答

I had a similar purpose. I wanted to resolve pressing the "Enter" key on the keyboard (which I wanted to customize) in an AutoCompleteTextView which extends TextView. I tried different solutions from above and they seemed to work. BUT I experienced some problems when I switched the input type on my device (Nexus 4 with AOKP ROM) from SwiftKey 3 (where it worked perfectly) to the standard Android keyboard (where instead of handling my code from the listener, a new line was entered after pressing the "Enter" key. It took me a while to handle this problem, but I don't know if it will work under all circumstances no matter which input type you use.

这是我的解决方案:

在xml中设置TextView的输入类型属性为"text":

android:inputType="text"

自定义键盘上“Enter”键的标签:

myTextView.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

将OnEditorActionListener设置为TextView:

myTextView.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event)
    {
    boolean handled = false;
    if (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

        handled = true;
    }
    return handled;
    }
});

我希望这能帮助其他人避免我遇到的问题,因为它们几乎把我逼疯了。

如果使用DataBinding,请参见https://stackoverflow.com/a/52902266/2914140和https://stackoverflow.com/a/67933283/2914140。

Bindings.kt:

@BindingAdapter("onEditorEnterAction")
fun EditText.onEditorEnterAction(callback: OnActionListener?) {
    if (callback == null) setOnEditorActionListener(null)
    else setOnEditorActionListener { v, actionId, event ->
        val imeAction = when (actionId) {
            EditorInfo.IME_ACTION_DONE,
            EditorInfo.IME_ACTION_SEND,
            EditorInfo.IME_ACTION_GO -> true
            else -> false
        }

        val keydownEvent = event?.keyCode == KeyEvent.KEYCODE_ENTER 
            && event.action == KeyEvent.ACTION_DOWN

        if (imeAction or keydownEvent) {
            callback.enterPressed()
            return@setOnEditorActionListener true
        }
        return@setOnEditorActionListener false
    }
}

interface OnActionListener {
    fun enterPressed()
}

layout.xml:

<data>
    <variable
        name="viewModel"
        type="YourViewModel" />
</data>    

<EditText
    android:imeOptions="actionDone|actionSend|actionGo"
    android:singleLine="true"
    android:text="@={viewModel.message}"
    app:onEditorEnterAction="@{() -> viewModel.send()}" />

你应该这样做。它也隐藏在Android开发者的样例代码“蓝牙聊天”中。用你自己的变量和方法替换“example”的粗体部分。

首先,把你需要的东西导入到主Activity中,你想让返回按钮做一些特殊的事情:

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

现在,创建一个类型为TextView的变量。OnEditorActionListener作为返回键(这里我使用exampleListener);

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

然后,您需要告诉侦听器当按下返回按钮时该做什么。它需要知道我们谈论的EditText是什么(这里我使用exampleView),然后它需要知道当按下Enter键时要做什么(这里是example_confirm())。如果这是活动中最后一个或唯一一个EditText,它应该做与提交(或确定,确认,发送,保存等)按钮的onClick方法相同的事情。

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

最后,设置监听器(很可能在你的onCreate方法中);

exampleView.setOnEditorActionListener(exampleListener);

好吧,如果这些答案都对你不起作用,你还没生气,我有一个解决办法。 使用AppCompatMultiAutoCompleteTextView(是的!)而不是EditText与以下代码(kotlin)

val filter = InputFilter { source, start, end, _, _, _ ->
        var keepOriginal = true
        val sb = StringBuilder(end - start)
        for (i in start until end) {
            val c = source[i]
            if (c != '\n')
                sb.append(c)
            else {
                keepOriginal = false
                //TODO:WRITE YOUR CODE HERE
            }
        }
        if (keepOriginal) null else {
            if (source is Spanned) {
                val sp = SpannableString(sb)
                TextUtils.copySpansFrom(source, start, sb.length, null, sp, 0)
                sp
            } else {
                sb
            }
        }
    }

appCompatMultiAutoCompleteTextView.filters = arrayOf(filter);

它(可能)适用于所有设备,我在android 4.4和10上测试了它。它在小米中也起作用。 我他妈的♥机器人:)

我知道这已经有一年了,但我刚刚发现这非常适合EditText。

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

除了文本和空格,它可以阻止任何东西。我不能制表,“返回”(“\n”),或任何东西。