Android-ручка "Enter" в EditText

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

также интересно, есть ли способ манипулировать виртуальной клавиатурой таким образом, что кнопка "готово" помечена чем-то другим (например, "Go") и выполняет определенное действие при нажатии (опять же, как onSubmit).

20 ответов


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

да.

также интересно, есть ли способ управление виртуальной клавиатурой в таким образом, кнопка" готово" помечено что-то другое (например "Go") и выполняет определенное действие при нажатии (опять же, как onSubmit).

также да.

вы хотите посмотреть android:imeActionId и android:imeOptions атрибуты, плюс setOnEditorActionListener() метод, все от TextView.

для изменения текста кнопки "Готово" на пользовательскую строку используйте:

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

вот что вы делаете. Он также скрыт в примере кода разработчика Android "Bluetooth-чат". Замените жирные части, которые говорят "пример" С вашими собственными переменными и методами.

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

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 для отправки (или OK, Подтвердите, отправьте, сохраните, ЕТК) кнопка.

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

аппаратные клавиатуры всегда дают события ввода, но программные клавиатуры возвращают различные actionIDs и nulls в singleLine EditTexts. Этот код отвечает каждый раз, когда пользователь нажимает enter в 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
  }
};

внешний вид по умолчанию клавиши enter в singleLine=false дает изогнутую стрелку enter клавиатуры. Когда singleLine=true в последнем EditText ключ говорит сделано, и на EditTexts перед он говорит следующее. По умолчанию это поведение соответствует всем эмуляторам vanilla, android и google. Атрибут scrollHorizontal не имеет никакого значения. Нулевой тест важен, потому что реакция телефонов на мягкие вводы оставлена производителю и даже в эмуляторах, эмуляторы уровня ванили 16 реагируют на длинные мягкие вводы в многострочных и scrollHorizontal EditTexts с actionId NEXT и null для события.


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

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

это предотвращает все, кроме текста и пространства. Я не мог tab, "return" ("\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)и т. д.


у меня была похожая цель. Я хотел разрешить нажатие клавиши "Enter" на клавиатуре (которую я хотел настроить) в Autocompletextview, который расширяет 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;
    }
});

Я надеюсь, что это может помочь другие, чтобы избежать проблем, которые у меня были, потому что они почти сводили меня с ума.


эта страница точно описывает, как это сделать.

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

установить android: imeOptions тогда вы просто проверить ID действий в 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)


в 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 " ключу ввода. Клавиша ввода на клавиатуре изменится с "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;
        }
    });

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

Это должно работать

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

надежный способ ответить на в EditText-это TextWatcher, a LocalBroadcastManager и BroadcastReceiver. Вам нужно добавить библиотека поддержки v4 для использования LocalBroadcastManager. Я использую учебник вvogella.com: 7.3 "локальные широковещательные события с LocalBroadcastManager" из-за его полного краткого примера кода. В метода ontextchanged до is индекс конец перемен до изменения>;минус. Когда в TextWatcher поток пользовательского интерфейса занят обновлением редактируемого editText, поэтому мы отправляем намерение разбудить 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 в текстовом поле должен быть "текстом", чтобы то, что CommonsWare сказал работать. Просто попробовал все это, нет inputType до суда и ничего не сработало, Enter продолжал регистрироваться как soft 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" />

ответ Джареда Лоу работает как шарм для меня.

просто добавил Эти depencendy:

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

вот простая статическая функция, которую вы можете бросить в свой Utils или Keyboards класс, который будет выполнять код, когда пользователь нажимает клавишу ввода на аппаратной или программной клавиатуры. Это модифицированная версия отличного ответа @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;
        }
    };
}