Android – 在EditText中处理“Enter”

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

还想知道是否有一种方法来操纵虚拟键盘,使“完成”button被标记为别的东西(例如“Go”),并在单击时执行某个操作(又如onSubmit)。

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

是。

还想知道是否有一种方法来操纵虚拟键盘,使“完成”button被标记为别的东西(例如“Go”),并在单击时执行某个动作(又如onSubmit)。

也是。

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

要将“完成”button的文本更改为自定义string,请使用:

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

这是你做的。 它也隐藏在Android开发者的示例代码“蓝牙聊天”中。 用你自己的variables和方法replace“example”的粗体部分。

首先,将您需要的内容导入主要“活动”中您希望返回button执行某些特殊操作的位置:

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

现在,为你的返回键(在这里我使用exampleListener )创build一个TextView.OnEditorActionListenertypes的variables;

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

然后你需要告诉听众两件事情,当按下返回button时该怎么做。 它需要知道我们在讨论什么EditText(这里我使用exampleView ),然后当按下Enter键时(这里是example_confirm() ),它需要知道该怎么做。 如果这是您的活动中的最后一个或唯一的EditText,它应该与您的提交(或确定,确认,发送,保存等)button的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); 
 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; } }); 

硬件键盘总是产生input事件,但软件键盘在单线EditText中返回不同的动作ID和空值。 每当用户在EditText中按下input时,该代码就会响应此侦听器已设置为,无论EditText或键盘types如何。

 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中的input键的默认外观提供了一个弯曲的箭头input键盘。 当在最后一个EditText中singleLine = true时,关键字为DONE,在它之前的EditTexts中,它表示NEXT。 默认情况下,这个行为在所有的vanilla,android和google模拟器中都是一致的。 scrollHorizo​​ntal属性没有任何区别。 空testing是重要的,因为手机对软input的响应留给制造商,甚至在仿真器中,香草级的16级仿真器响应长行进入多行和scrollHorizo​​ntal EditTexts,actionId为NEXT,null事件。

我知道这是一个古老的,但我刚刚发现这个作品完美的EditText。

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

它防止任何东西,但文字和空间。 我无法标签,“返回”(“\ n”),或任何东西。

就像Chad的回应(对我来说几乎完美的工作)的一个附录,我发现我需要在KeyEvent动作types上添加一个检查,以防止我的代码执行两次(一次在键盘上,一次在键盘上事件)。

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

请参阅http://developer.android.com/reference/android/view/KeyEvent.html了解有关重复操作事件(按住Enter键)的信息等;

我有一个类似的目的。 我想解决在键盘上(我想要自定义)按下“Enter”键在扩展TextView的AutoCompleteTextView。 我尝试了不同的解决scheme,他们似乎工作。 但我遇到了一些问题,当我把我的设备上的inputtypes(Nexus 4与AOKP ROM)从SwiftKey 3(它工作完美)到标准的Android键盘(而不是从听众处理我的代码,一个新的行是按“Enter”键后进入,我花了一段时间来处理这个问题,但不知道在任何情况下,无论使用哪种inputtypes,它都能正常工作。

所以这是我的解决scheme:

将XML中的TextView的inputtypes属性设置为“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 (actionId == KeyEvent.KEYCODE_ENTER) { // Handle pressing "Enter" key here handled = true; } return handled; } }); 

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

在你的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键时,它会触发这个动作,因此你会处理它。

这个页面描述了如何做到这一点。

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

你也可以做

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

对我来说工作得很好
另外隐藏键盘

首先,你必须设置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; 

完美地工作

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

}

完美地工作

这在LG Android手机上正常工作。 它防止ENTER和其他特殊字符被解释为正常字符。 NextDonebutton自动出现, ENTER按预期工作。

 edit.setInputType(InputType.TYPE_CLASS_TEXT); 

在EditText中响应<enter>的可靠方法是使用TextWatcher , LocalBroadcastManager和BroadcastReceiver 。 您需要添加v4支持库以使用LocalBroadcastManager。 我在vogella.com上使用教程:7.3“使用LocalBroadcastManager进行本地广播事件”,因为它有完整简洁的代码示例。 在onTextChanged 之前变化结束 的索引变化 >;减去开始。 在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 

文本字段上的InputType必须是“文本”,以便CommonsWare所说的工作。 试了一下,试用之前没有inputType,没有任何工作,进入保持注册为软input。 在inputType = text之后,包括setImeLabel在内的所有东西都起作用了。

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

这应该工作

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

Jared Law的回答对我来说就像是一种魅力。

只是添加了这些依赖性:

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