ChatGPT解决这个技术问题 Extra ChatGPT

Android - 在 EditText 中处理“Enter”

我想知道是否有一种方法可以处理用户在输入 EditText 时按下 Enter,类似于 onSubmit HTML 事件。

还想知道是否有一种方法可以操作虚拟键盘,即“完成”按钮被标记为其他内容(例如“开始”)并在单击时执行特定操作(再次,如 onSubmit)。

科特林&扩展:看看这里:stackoverflow.com/a/48810268/1912924

r
robguinness

我想知道是否有一种方法可以处理用户在输入 EditText 时按 Enter 键,例如 onSubmit HTML 事件。

是的。

还想知道是否有一种方法可以操作虚拟键盘,即“完成”按钮被标记为其他内容(例如“开始”)并在单击时执行特定操作(再次,如 onSubmit)。

也是的。

您需要查看 TextView 上的 android:imeActionIdandroid:imeOptions 属性以及 setOnEditorActionListener() 方法。

要将“完成”按钮的文本更改为自定义字符串,请使用:

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

(PS EditText 扩展了 TextView,因此为什么您应该查看的属性位于 TextView 上 - 当我第一次阅读最后一句话时,我做了一个双重考虑:))
作为注释。并非所有键盘都支持标准 android:imeOptions 属性。这真是令人失望。例如,IME_ACTION_DONE 定义为 6,其中 HTC 默认键盘(在 Incredible、Evo 4G 等手机上)返回键定义为 0。
此外,如果您使用 imeOptions 确保您也使用 inputType="text" 或其他等效项。确保键盘听你的!连结1
“是的” - 你会比这更具描述性吗?他可能会问如何实施该解决方案。
@AlWang:首先,答案中涵盖了您关注的领域(请参阅以“您将要...”开头)。其次,这个答案来自六年前,因此可以假设OP的问题已经解决。毕竟,OP接受了答案。
J
Jarod DY Law
final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});

出于某种原因,当我在编辑文本中单击 enter 时,整个编辑文本会向下移动...我该如何解决这个问题?
@RuchirBaronia 将 android:maxLines="1" 添加到您的 EditText。您的 EditText 不是“向下移动”,而是在输入的文本中插入换行符。将 maxLines 设置为 1 可防止插入换行符。
此解决方案仅适用于硬件键盘,不适用于软/虚拟键盘。如果您依赖它,那么对于没有连接键盘的用户,您的应用程序将被破坏。
对 CommonsWare 没有冒犯,但他的 RTFM 答案远没有这个简单的例子有用,它显示了如何做到这一点。谢谢!
@AutonomousApps,我经常看到 CommonsWare 的答案。自 2009 年 Android 诞生以来,他就很幸运地回答了这个问题。通常是“是”、“否”、“不可能”等,通常没有代码。现在他的回答通常已经过时了,所以我尽量不听从他的建议。
p
poolie

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

首先,将您需要的内容导入到您希望返回按钮执行特殊操作的主 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);

很好,我使用了 EditorInfo.IME_ACTION_SEND,并且在 XML 上有 android:imeOptions="actionSend"。
寻找 EditorInfo.IME_ACTION_SEND 对我(模拟器)没有任何影响,所以作为万无一失的触发器,我还寻找了 KeyEvent.KEYCODE_ENTER。见这里:stackoverflow.com/questions/2004344/…
通常最好在 KeyEvent.ACTION_UP 上执行操作。为此,您需要首先使用 ACTION_DOWN 事件:if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }。然后您可以检查 ACTION_UP 事件并执行操作(类似于上面的答案)。如果您不使用 ACTION_DOWN 事件,则不会为 ACTION_UP 调用 onEditorAction
这对我有用:if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...} -- 无法使用任何其他方法
A
Arjun Verma

此页面准确描述了如何执行此操作。

https://developer.android.com/training/keyboard-input/style.html

设置 android:imeOptions 然后您只需检查 onEditorAction 中的 actionId。因此,如果您将 imeOptions 设置为“actionDone”,那么您将在 onEditorAction 中检查“actionId == EditorInfo.IME_ACTION_DONE”。另外,请确保设置 android:inputType。

如果使用 Material Design 将代码放在 TextInputEditText 中。

这是上面链接示例中的 EditText:

<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

您也可以使用 setImeOptions(int) 函数以编程方式进行设置。这是上面链接示例中的 OnEditorActionListener:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

非常感谢,我想这应该是这个用例的默认/接受的答案(在 EditText 上处理输入/提交)
e
earlcasper

硬件键盘总是产生输入事件,但软件键盘在单行 EditTexts 中返回不同的 actionID 和空值。每次用户在此侦听器已设置的 EditText 中按 Enter 键时,此代码都会响应,无论 EditText 或键盘类型如何。

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

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.


    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

在 singleLine=false 中输入键的默认外观给出了一个弯曲的箭头输入键盘。当最后一个 EditText 中的 singleLine=true 时,键表示 DONE,而在 EditTexts 之前它表示 NEXT。默认情况下,此行为在所有 vanilla、android 和 google 模拟器中是一致的。 scrollHorizontal 属性没有任何区别。空测试很重要,因为手机对软输入的响应留给制造商,即使在模拟器中,香草 Level 16 模拟器也会响应多行和滚动水平 EditTexts 中的长软输入,actionId 为 NEXT,null 为事件。


当我升级 Java 时,我的 Android 工具链坏了。它是 32 位的。我重新安装了 64 位的所有东西,发现现在有更多的公共模拟器版本可用。我必须承认,我只知道 EditorActionListener 的行为在我测试的模拟器中是一致的。
当我在我的博客上发布此内容时,有人评论说要使其在 eclipse 上运行,您需要更改默认的 ime 操作,添加 android:imeOptions=”actionGo”。
哎呀,我误读了我博客文章的评论。要使其在 eclipse 上运行,您需要更改默认的 ime 操作,添加 android:imeOptions=”actionGo”。到布局 xml 中的“EditText”。
经过进一步思考,我的最后一条评论指的是 Ant 和 Eclipse
N
Newbie

我知道这是一岁了,但我刚刚发现这非常适合 EditText。

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

它可以防止除文本和空格之外的任何内容。我不能制表符、“返回”(“\n”)或任何东西。


为我工作,添加了 IME_ACTION_DONE
如果您想禁用“Enter”键,效果很好。
i
inanutshellus

正如 Chad 响应的附录(这对我来说几乎完美),我发现我需要添加对 KeyEvent 操作类型的检查,以防止我的代码执行两次(一次在按键上,一次在按键下事件)。

if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
    // your code here
}

有关重复动作事件(按住回车键)等的信息,请参阅 http://developer.android.com/reference/android/view/KeyEvent.html


M
ManxDev

我也有类似的目的。我想解决在扩展 TextView 的 AutoCompleteTextView 中按下键盘上的“Enter”键(我想自定义)。我从上面尝试了不同的解决方案,它们似乎有效。但是,当我将设备(带有 AOKP ROM 的 Nexus 4)上的输入类型从 SwiftKey 3(它工作得很好)切换到标准的 Android 键盘(而不是从侦听器处理我的代码时,我遇到了一些问题,新行是按“Enter”键后输入。我花了一段时间来处理这个问题,但我不知道无论您使用哪种输入类型,它是否在所有情况下都能正常工作。

所以这是我的解决方案:

将xml中TextView的输入类型属性设置为“text”:

android:inputType="text"

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

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

为 TextView 设置一个 OnEditorActionListener:

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

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


不幸的是,这不适用于 SwiftKey 的新版本 4。它又让我发疯了……:-/
你的 IF 不正确。使用:'event.getKeyCode() == KeyEvent.KEYCODE_ENTER'
适合我。还要记住在 IF 语句中再次插入 setImeActionLabel ,否则自定义文本在第一次按下后会消失。
他的 IF 是正确的,因为他将他的 actionId 设置为上面的 KeyEvent.KEYCODE_ENTER :-D,但是是的,其他所有人都可能想要使用 event.getKeyCode() == KeyEvent.KEYCODE_ENTER
A
ARK

在您的 xml 中,将 imeOptions 属性添加到 editText

<EditText
    android:id="@+id/edittext_additem"
    ...
    android:imeOptions="actionDone"
    />

然后,在您的 Java 代码中,将 OnEditorActionListener 添加到相同的 EditText

mAddItemEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(actionId == EditorInfo.IME_ACTION_DONE){
                //do stuff
                return true;
            }
            return false;
        }
    });

这是解释 - imeOptions=actionDone 会将“actionDone”分配给 EnterKey。键盘中的 EnterKey 将从“Enter”变为“Done”。因此,当按下 Enter 键时,它将触发此操作,因此您将处理它。


Z
Zar E Ahmer

你也可以这样做。。

editText.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getKeyCode() ==       KeyEvent.KEYCODE_ENTER) 
                {
                    Log.i("event", "captured");

                    return false;
                } 

            return false;
        }
    });

出于某种原因,当我在编辑文本中单击 enter 时,整个编辑文本会向下移动...我该如何解决这个问题?
我想你想学习 stackoverflow.com/questions/10978038/… 否则给我看看你的 xml
L
LifeiSHot

首先,您必须设置 EditText 听按键

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    // Set the EditText listens to key press
    EditText edittextproductnumber = (EditText) findViewById(R.id.editTextproductnumber);
    edittextproductnumber.setOnKeyListener(this);

}

其次,定义按键时的事件,例如设置TextView文本的事件:

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

 // Listen to "Enter" key press
 if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
 {
     TextView textviewmessage = (TextView) findViewById(R.id.textViewmessage);
     textviewmessage.setText("You hit 'Enter' key");
     return true;
 }

return false;   

}

最后,不要忘记在顶部导入 EditText、TextView、OnKeyListener、KeyEvent:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;

V
Vlad
     password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                submit.performClick();
                return true;
            }
            return false;
        }
    });

对我来说效果很好除了隐藏键盘


D
Domi mtz

完美工作

public class MainActivity extends AppCompatActivity {  
TextView t;
Button b;
EditText e;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b = (Button) findViewById(R.id.b);
    e = (EditText) findViewById(R.id.e);

    e.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            if (before == 0 && count == 1 && s.charAt(start) == '\n') {

                b.performClick();
                e.getText().replace(start, start + 1, ""); //remove the <enter>
            }

        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable s) {}
    });

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            b.setText("ok");

        }
    });
}

}

完美工作


k
kreker
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId != 0 || event.getAction() == KeyEvent.ACTION_DOWN) {
                // Action
                return true;
            } else {
                return false;
            }
        }
    });

xml

<EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionGo|flagNoFullscreen"
        android:inputType="textPassword"
        android:maxLines="1" />

O
ORY

这应该工作

input.addTextChangedListener(new TextWatcher() {

           @Override
           public void afterTextChanged(Editable s) {}

           @Override    
           public void beforeTextChanged(CharSequence s, int start,
             int count, int after) {
           }

           @Override    
           public void onTextChanged(CharSequence s, int start,
             int before, int count) {
               if( -1 != input.getText().toString().indexOf( "\n" ) ){
                   input.setText("Enter was pressed!");
                    }
           }
          });

l
lainz

在您的编辑器中键入此代码,以便它可以导入必要的模块。

 query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });

query = EditText 字段的名称,并在 EditText 的 xml 中添加 ->(android:imeOptions="actionSearch")。
R
Rasoul Miri

你可以用这种方式

editText.setOnEditorActionListener((v, actionId, event) -> {
       if (actionId == EditorInfo.IME_ACTION_DONE) {
          // Do some things      
          return true;
       }
       return false;
});

您可以看到操作列表 there

例如:

IME_ACTION_GO

IME_ACTION_SEARCH

IME_ACTION_SEND


C
CoolMind

如果您使用 DataBinding,请参阅 https://stackoverflow.com/a/52902266/2914140https://stackoverflow.com/a/67933283/2914140

绑定.kt:

@BindingAdapter("onEditorEnterAction")
fun EditText.onEditorEnterAction(callback: OnActionListener?) {
    if (f == 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()
}

布局.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()}" />

S
Satan Pandeya

这在 LG Android 手机上运行良好。它可以防止 ENTER 和其他特殊字符被解释为普通字符。 NextDone 按钮会自动出现,并且 ENTER 会按预期工作。

edit.setInputType(InputType.TYPE_CLASS_TEXT);

这是唯一对我有用的东西。我有一个摩托罗拉 Moto X 2,通常它有一个带有箭头和所有东西的“返回”键。这将其更改为复选标记,我终于能够让听众使用它。 (在它刚刚创建一个新行之前)。所以如果其他人有这个问题......
J
JohnnyLambada

这是一个简单的静态函数,您可以将其放入 UtilsKeyboards 类中,当用户按下硬件或软件键盘上的返回键时,该函数将执行代码。这是@earlcasper 出色答案的修改版

 /**
 * Return a TextView.OnEditorActionListener that will execute code when an enter is pressed on
 * the keyboard.<br>
 * <code>
 *     myTextView.setOnEditorActionListener(Keyboards.onEnterEditorActionListener(new Runnable()->{
 *         Toast.makeText(context,"Enter Pressed",Toast.LENGTH_SHORT).show();
 *     }));
 * </code>
 * @param doOnEnter A Runnable for what to do when the user hits enter
 * @return the TextView.OnEditorActionListener
 */
public static TextView.OnEditorActionListener onEnterEditorActionListener(final Runnable doOnEnter){
    return (__, actionId, event) -> {
        if (event==null) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // Capture soft enters in a singleLine EditText that is the last EditText.
                doOnEnter.run();
                return true;
            } else if (actionId==EditorInfo.IME_ACTION_NEXT) {
                // Capture soft enters in other singleLine EditTexts
                doOnEnter.run();
                return true;
            } else {
                return false;  // Let system handle all other null KeyEvents
            }
        } else if (actionId==EditorInfo.IME_NULL) {
            // Capture most soft enters in multi-line EditTexts and all hard enters.
            // They supply a zero actionId and a valid KeyEvent rather than
            // a non-zero actionId and a null event like the previous cases.
            if (event.getAction()==KeyEvent.ACTION_DOWN) {
                // We capture the event when key is first pressed.
                return true;
            } else {
                doOnEnter.run();
                return true;   // We consume the event when the key is released.
            }
        } else {
            // We let the system handle it when the listener
            // is triggered by something that wasn't an enter.
            return false;
        }
    };
}

请注意,这使用需要 Java 1.8 的 lambda 表达式,但它很容易将其转换为不使用 lambda。但是,我在这类解决方案中看到的问题是虚拟键盘不会自动隐藏,并且如果处于全屏模式(横向的小型设备),用户按下 Enter 或 DONE 后全屏模式不会关闭
A
Agilanbu

文本字段上的 InputType 必须是 text 才能使 CommonsWare 所说的工作。刚刚尝试了所有这些,试用前没有inputType,没有任何效果,Enter一直注册为软输入。在 inputType = text 之后,包括 setImeLabel 在内的一切都起作用了。

示例: android:inputType="text"


B
Brinda Rathod
   final EditText edittext = (EditText) findViewById(R.id.edittext);
    edittext.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                // Perform action on key press
                Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

a
android developer

使用 Kotlin,我创建了一个函数来处理 EditText 的各种“完成”式操作,包括键盘,并且可以修改它,也可以根据需要处理其他键:

private val DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_DONE)
private val DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)

fun EditText.setOnDoneListener(function: () -> Unit, onKeyListener: OnKeyListener? = null, onEditorActionListener: TextView.OnEditorActionListener? = null,
                               actionsToHandle: Collection<Int> = DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT,
                               keysToHandle: Collection<Int> = DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT) {
    setOnEditorActionListener { v, actionId, event ->
        if (onEditorActionListener?.onEditorAction(v, actionId, event) == true)
            return@setOnEditorActionListener true
        if (actionsToHandle.contains(actionId)) {
            function.invoke()
            return@setOnEditorActionListener true
        }
        return@setOnEditorActionListener false
    }
    setOnKeyListener { v, keyCode, event ->
        if (onKeyListener?.onKey(v, keyCode, event) == true)
            return@setOnKeyListener true
        if (event.action == KeyEvent.ACTION_DOWN && keysToHandle.contains(keyCode)) {
            function.invoke()
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
}

因此,示例用法:

        editText.setOnDoneListener({
            //do something
        })

至于更改标签,我认为这取决于键盘应用程序,并且通常仅在横向更改,如 here 所示。无论如何,这个示例用法:

        editText.imeOptions = EditorInfo.IME_ACTION_DONE
        editText.setImeActionLabel("ASD", editText.imeOptions)

或者,如果您想使用 XML:

    <EditText
        android:id="@+id/editText" android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:imeActionLabel="ZZZ" android:imeOptions="actionDone" />

结果(以横向显示):

https://i.stack.imgur.com/gYoE2.png


J
J7bits

Kotlin 解决方案使用 Lambda 表达式对输入新闻做出反应:

        editText.setOnKeyListener { _, keyCode, event ->
            if(keyCode == KeyEvent.KEYCODE_ENTER && event.action==KeyEvent.ACTION_DOWN){
            //react to enter press here
            }
            true
        }

不对事件类型进行额外检查将导致该侦听器在按下一次时被调用两次(一次用于 ACTION_DOWN,一次用于 ACTION_UP)


e
earlcasper

一种可靠的方式来响应 <enter>在 EditText 中包含 TextWatcherLocalBroadcastManagerBroadcastReceiver。您需要添加 v4 support library 才能使用 LocalBroadcastManager。我使用 vogella.com 的教程:7.3 "Local broadcast events with LocalBroadcastManager" 因为它完整简洁的代码示例。在 onTextChanged 中 before更改结束的索引更改之前>;减去开始。当在 TextWatcher 中 UI 线程忙于更新 editText 的可编辑内容时,我们发送一个 Intent 以在 UI 线程完成更新 editText 时唤醒 BroadcastReceiver。

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.Editable;
//in onCreate:
editText.addTextChangedListener(new TextWatcher() {
  public void onTextChanged
  (CharSequence s, int start, int before, int count) {
    //check if exactly one char was added and it was an <enter>
    if (before==0 && count==1 && s.charAt(start)=='\n') {
    Intent intent=new Intent("enter")
    Integer startInteger=new Integer(start);
    intent.putExtra("Start", startInteger.toString()); // Add data
    mySendBroadcast(intent);
//in the BroadcastReceiver's onReceive:
int start=Integer.parseInt(intent.getStringExtra("Start"));
editText.getText().replace(start, start+1,""); //remove the <enter>
//respond to the <enter> here

如果使用任何 text* 输入类型(例如 android:inputType="textCapSentences"),则回车会从输入中过滤掉,因此当用户按下 Enter 键时不会调用 onTextChanged()。
S
Someone Somewhere

Butterknife 还没有回答这个问题

布局 XML

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/some_input_hint">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/textinput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionSend"
            android:inputType="text|textCapSentences|textAutoComplete|textAutoCorrect"/>
    </android.support.design.widget.TextInputLayout>

JAVA应用

@OnEditorAction(R.id.textinput)
boolean onEditorAction(int actionId, KeyEvent key){
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND || (key.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
        //do whatever you want
        handled = true;
    }
    return handled;
}

TextInputLayout 和 Butterknife:赢了!
C
Chandana Gihan Perera

将“txtid”替换为您的 EditText ID。

EditText txtinput;
txtinput=findViewById(R.id.txtid)    
txtinput.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER))     || (actionId == EditorInfo.IME_ACTION_DONE)) {
                
                //Code for the action you want to proceed with.

                InputMethodManager inputManager = (InputMethodManager)
                        getSystemService(Context.INPUT_METHOD_SERVICE);

                 inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                        InputMethodManager.HIDE_NOT_ALWAYS);
            }
            return false;
        }
    });

J
Jacky Supit

添加这些依赖项,它应该可以工作:

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;

M
Michael

当用户按下返回键时,这将为您提供一个可调用的函数。

fun EditText.setLineBreakListener(onLineBreak: () -> Unit) {
    val lineBreak = "\n"
    doOnTextChanged { text, _, _, _ ->
        val currentText = text.toString()

        // Check if text contains a line break
        if (currentText.contains(lineBreak)) {

            // Uncommenting the lines below will remove the line break from the string
            // and set the cursor back to the end of the line

            // val cleanedString = currentText.replace(lineBreak, "")
            // setText(cleanedString)
            // setSelection(cleanedString.length)

            onLineBreak()
        }
    }
}

用法

editText.setLineBreakListener {
    doSomething()
}

a
abdul jalil

检测 Enter 键被按下的最简单方法是:

mPasswordField.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (event!= null) {   // KeyEvent: If triggered by an enter key, this is the event; otherwise, this is null.
                    signIn(mEmailField.getText().toString(), mPasswordField.getText().toString());
                    return true;
                } else {
                    return false;
                }
            }
        });