Android-在EditText中处理“ Enter”


459

我想知道是否有一种方法可以处理用户Enter在键入EditTexton时发生的按下操作,例如onSubmit HTML事件。

还想知道是否有一种方法可以操纵虚拟键盘,使“完成”按钮标记为其他名称(例如“转到”),并在单击时执行某种操作(再次类似于onSubmit)。


1
Kotlin&Extensions:在这里看看:stackoverflow.com/a/48810268/1912924
Francesco Donzello,

Answers:


374

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

是。

还想知道是否有一种方法可以操纵虚拟键盘,使“完成”按钮标记为其他名称(例如“转到”),并在单击时执行某种操作(再次类似于onSubmit)。

也可以

您将要查看android:imeActionIdandroid:imeOptions属性以及setOnEditorActionListener()方法,全部都在上TextView

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

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

26
(PS EditText扩展了TextView,因此,为什么您应该查看的属性都位于TextView上-当我第一次读完最后一句话时,我做了
两遍

15
作为说明。并非所有的键盘都支持标准的android:imeOptions属性。真是令人失望。例如,IME_ACTION_DONE被定义为6,其中所述HTC默认键盘(在例如难以相信,EVO 4G电话)的返回键被定义为0。
fernferret

13
另外,如果您使用imeOptions,请确保还使用inputType =“ text”或其他等效项。确保键盘能听到您的声音!Nexus1
Blundell,

6
“是”-您会比这更具描述性吗?他可能会问如何实施该解决方案。
Al Wang

4
@AlWang:首先,答案涵盖了您关注的领域(请参阅以“您将要...开始”)。其次,这个答案是六年前的,因此人们可以假设OP的问题已解决。毕竟,OP接受了答案。
CommonsWare,2015年

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

1
由于某些原因,当我单击enter编辑文本时,整个编辑文本会向下移动...如何解决此问题?
Ruchir Baronia'3

1
@RuchirBaronia将android:maxLines =“ 1”添加到您的EditText。您的EditText不是“向下移动”,而是在输入的文本中插入一个换行符。将maxLines设置为1可防止插入换行符。
lustig 2016年

3
此解决方案仅适用于硬件键盘,不适用于软/虚拟键盘。如果您依赖它,那么对于未连接键盘的用户,您的应用将被破坏。
user3562927

12
没有冒犯CommonsWare,但他的RTFM回答是这样不是正好说明如何做这个简单的例子不太有用。谢谢!
AutonomousApps

1
@AutonomousApps,我经常看到CommonsWare的答案。自2009年Android诞生以来,他很幸运能回答。通常为“是”,“否”,“不可能”等,通常没有代码。现在他的答案通常已经过时,所以我尽量不遵循他的建议。
CoolMind

215

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

首先,将所需的内容导入到主活动中,在该活动中您希望返回按钮执行一些特殊的操作:

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

20
很好,我使用过EditorInfo.IME_ACTION_SEND,并且在XML上有android:imeOptions =“ actionSend”。
巴尼

寻找EditorInfo.IME_ACTION_SEND对我(模拟器)没有影响,因此,作为一个万无一失的触发器,我也寻找KeyEvent.KEYCODE_ENTER。在这里看到:stackoverflow.com/questions/2004344/...
有人的地方

4
通常最好在上执行操作KeyEvent.ACTION_UP。为了使它起作用,您需要首先使用ACTION_DOWN事件:if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }。然后,您可以检查ACTION_UP事件并执行操作(类似于以上答案)。如果您不使用该ACTION_DOWN事件,则onEditorAction不会被要求ACTION_UP
ashughes

2
这就是对我if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}
乔纳森·埃利斯

38

硬件键盘总是产生enter事件,但是软件键盘在singleLine EditTexts中返回不同的actionID和null。每次用户在已将此侦听器设置为的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中,Enter键的默认外观为弯曲的Enter键键盘。当最后一个EditText中的singleLine = true时,键显示DONE,而在它之前的EditTexts上显示NEXT。默认情况下,此行为在所有普通,Android和Google模拟器中都是一致的。scrollHorizo​​ntal属性没有任何区别。空测试很重要,因为电话对软输入的响应留给了制造商,甚至在仿真器中,香草的16级仿真器也对多行和scrollHorizo​​ntal EditTexts中的长软输入做出了响应,其actionId为NEXT,null为null。事件。


当我升级Java时,我的Android工具链中断了。它是32位的。我重新安装了所有64位版本,发现现在有更多可用的公共仿真器版本。我必须承认,我只知道在我测试的模拟器中EditorActionListener的行为是一致的。
Earlcasper 2012年

当我在博客上发布此内容时,有人评论说要使其在eclipse上运行,您需要更改默认的ime动作,添加android:imeOptions =” actionGo”。
Earlcasper 2013年

糟糕,我在博客中误读了评论。要使其在eclipse上运行,您需要更改默认的ime动作,添加android:imeOptions =” actionGo”。到布局xml中的“ EditText”。
earlcasper

在进一步思考时,我的最后评论同时提到了Ant和Eclipse
earlcasper

27

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

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

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

这是上面链接的示例中的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;
    }
});

21

我知道这已经一岁了,但是我刚刚发现这对于EditText非常有效。

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

它可以防止文本和空格以外的任何内容。我无法制表符,“返回”(“ \ n”)或其他任何内容。


为我工作,加上了IME_ACTION_DONE
htafoya 2012年

1
如果您想禁用“ Enter”键,则工作正常。
deeJ

16

就像Chad响应的附录(对我而言效果非常理想)一样,我发现我需要对KeyEvent操作类型进行检查,以防止我的代码执行两次(一次在键盘上按下,一次在键盘上按下一次)事件)。

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

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


16

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

所以这是我的解决方案:

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

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

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


不幸的是,这不适用于新版本的SwiftKey 4。而且它再次让我发疯...:-/
kaolick

3
您的IF不正确。使用:'event.getKeyCode()== KeyEvent.KEYCODE_ENTER'–
Loda

适合我。还要记住,再次在IF语句中插入setImeActionLabel,否则自定义文本将在第一次按下后消失。
史蒂夫·罗杰斯

他的IF是正确的,因为他将他的actionId设置为:-D上方的KeyEvent.KEYCODE_ENTER,但是是的,其他所有人可能都想使用event.getKeyCode()== KeyEvent.KEYCODE_ENTER
Ray Hulha

15

在您的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将为“ EnterKey”分配“ actionDone”。键盘中的EnterKey将从“ Enter”更改为“ Done”。因此,当按下Enter键时,它将触发此操作,因此您将对其进行处理。


9

您也可以做到。

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编辑文本时,整个编辑文本会向下移动...如何解决此问题?
Ruchir Baronia'3

我认为您想学习stackoverflow.com/questions/10978038/… 否则请告诉我您的xml
Jawad Zeb

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

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


5

首先,您必须将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;

5

完美地工作

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

        }
    });
}

}

完美地工作


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

4

这应该工作

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

4

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

 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”)。
Sanjit Prasad

3

在LG Android手机上可以正常使用。它防止将ENTER其他特殊字符解释为普通字符。NextDone按钮会自动出现,并且ENTER可以正常工作。

edit.setInputType(InputType.TYPE_CLASS_TEXT);

这是唯一对我有用的东西。我有一个Motorola Moto X 2,通常它带有箭头和所有内容的“ Return”键。这将其更改为选中标记,我终于能够使侦听器进行处理。(在它刚刚创建新行之前)。所以,如果有人遇到这个问题……
神秘可乐

2

这是一个简单的静态函数,您可以将其放入您的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后全屏模式不会关闭
jk7

2

文本字段上的InputType必须是textCommonsWare所说的才能起作用。只是尝试了所有这些,在尝试之前没有inputType,也没有任何作用,Enter一直注册为软输入。之后inputType = text,包括setImeLabel在内的所有内容均起作用。

范例: android:inputType="text"


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

1

响应EditText中<enter>的可靠方法是使用TextWatcherLocalBroadcastManagerBroadcastReceiver。您需要添加v4支持库才能使用LocalBroadcastManager。我使用vogella.com上的教程:7.3“使用LocalBroadcastManager进行本地广播事件”,因为它具有完整的简洁代码示例。在onTextChanged中,before更改 >;减去开始之前更改结束的索引。当在TextWatcher中时,UI线程正忙于更新editText的可编辑内容,因此当UI线程完成对editText的更新后,我们将发送一个Intent来唤醒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()。
jk7 '18年

1

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 APP

@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:胜利!
哈维

1

使用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
        })

至于更改标签,我认为它取决于键盘应用程序,并且通常仅根据横向更改,如此处所述。无论如何,示例用法如下:

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

结果(以横向显示):

在此处输入图片说明


0

添加这些依赖,它应该起作用:

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

0

当用户按下返回键时,这将为您提供可调用的功能。

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()
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.