Android – ручка «Enter» в EditText

Мне интересно, есть ли способ обработать пользователя нажатием Enter во время ввода в EditText , что-то вроде события onSubmit HTML.

Также интересно, есть ли способ манипулировать виртуальной клавиатурой таким образом, что кнопка «Готово» помечена как-то еще (например, «Перейти») и выполняет определенное действие при нажатии (опять же, например, onSubmit).

Solutions Collecting From Web of "Android – ручка «Enter» в EditText"

Мне интересно, есть ли способ обработать пользователя нажатием Enter во время ввода в EditText, что-то вроде события onSubmit HTML.

Да.

Также интересно, есть ли способ манипулировать виртуальной клавиатурой таким образом, что кнопка «Готово» помечена как-то еще (например, «Перейти») и выполняет определенное действие при нажатии (опять же, например, onSubmit).

Также да.

Вам нужно будет посмотреть android:imeActionId и android:imeOptions , а также метод setOnEditorActionListener() , все в TextView .

Чтобы изменить текст кнопки «Готово» на пользовательскую строку, используйте:

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

Вот что вы делаете. Он также скрыт в образце кода разработчика Android «Bluetooth Chat». Замените полужирные части, которые говорят «пример» своими собственными переменными и методами.

Во-первых, импортируйте то, что вам нужно, в основное действие, в котором вы хотите, чтобы кнопка возврата делала что-то особенное:

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

Аппаратные клавиатуры всегда дают события ввода, но программные клавиатуры возвращают разные значения actionID и null в singleLine EditTexts. Этот код отвечает каждый раз, когда пользователь нажимает кнопку ввода в EditText, на который установлен этот слушатель, вне зависимости от типа 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 дает согнутую стрелку на клавиатуре. Когда singleLine = true в последнем EditText, ключ говорит DONE, а на EditTexts перед ним он говорит NEXT. По умолчанию это поведение согласовано во всех эмуляторах vanilla, android и google. Атрибут scrollHorizontal не имеет никакого значения. Нулевой тест важен, потому что отклики телефонов на мягкие входные данные оставляются производителю и даже в эмуляторах, эмуляторы уровня 16 ванили реагируют на длинные мягкие входящие в многострочные и прокручивающие горизонтальные EditTexts с actionId из NEXT и null для событие.

Я знаю, что это год, но я просто обнаружил, что это отлично работает для EditText.

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

Он предотвращает все, кроме текста и пространства. Я не мог вставить вкладку, «вернуться» («\ n») или что-нибудь еще.

Как дополнение к ответу Чада (который работал почти отлично для меня), я обнаружил, что мне нужно добавить проверку типа действия KeyEvent, чтобы предотвратить выполнение кода дважды (один раз на клавиатуре и один раз на клавиатуре мероприятие).

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

См. http://developer.android.com/reference/android/view/KeyEvent.html для получения информации о повторяющихся событиях (удерживая клавишу ввода) и т. Д.

У меня была аналогичная цель. Я хотел разрешить нажатие клавиши «Enter» на клавиатуре (которую я хотел настроить) в AutoCompleteTextView, которая расширяет TextView. Я попробовал разные решения сверху, и они, похоже, работали. НО я столкнулся с некоторыми проблемами, когда я переключил тип ввода на своем устройстве (Nexus 4 с AOKP ROM) из SwiftKey 3 (где он работал отлично) на стандартную клавиатуру Android (где вместо обработки моего кода от слушателя новая строка была После нажатия клавиши «Enter». Мне потребовалось некоторое время, чтобы справиться с этой проблемой, но я не знаю, будет ли она работать при любых обстоятельствах независимо от того, какой тип ввода вы используете.

Итак, вот мое решение:

Задайте атрибут типа ввода TextView в xml для «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, она вызывает это действие и, таким образом, вы справитесь с этим.

Вы также можете это сделать.

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

На этой странице описано, как это сделать.

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

Установите android: imeOptions, тогда вы просто проверите actionId в onEditorAction. Поэтому, если вы установите imeOptions в «actionDone», вы должны проверить «actionId == EditorInfo.IME_ACTION_DONE» в onEditorAction. Кроме того, не забудьте установить 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; } }); 
  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 и других специальных символов как нормального характера. Кнопка « Next или « Done появляется автоматически, и ENTER работает должным образом.

 edit.setInputType(InputType.TYPE_CLASS_TEXT); 

Надежный способ ответить на <enter> в EditText – это TextWatcher , LocalBroadcastManager и BroadcastReceiver . Вам нужно добавить библиотеку поддержки v4 для использования LocalBroadcastManager. Я использую учебное пособие на vogella.com : 7.3 «Локальные события трансляции с помощью LocalBroadcastManager» из-за его полного краткого кода. Пример. В onTextChanged before есть индекс конца изменения перед изменением >; минус начало. Когда в TextWatcher поток пользовательского интерфейса занят обновлением editText, мы отправляем Intent, чтобы разбудить BroadcastReceiver, когда поток пользовательского интерфейса завершен, обновив editText.

 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 в текстовом поле должен быть «text», чтобы CommonsWare сказал работать. Просто попробовал все это, не вводил тип ввода перед испытанием и ничего не работал, Enter продолжал регистрироваться как мягкий ввод. После 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!"); } } }); 

Ответ Джареда Закон работает как прелесть для меня.

Просто добавил эти depencendy:

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