Android - обрабатывать «Enter» в EditText

459

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

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

Феликс
источник
1
Kotlin & Extensions: посмотрите здесь: stackoverflow.com/a/48810268/1912924
Франческо Донзелло

Ответы:

374

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

Да.

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

Тоже да.

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

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

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);
CommonsWare
источник
26
(PS EditText расширяет TextView, поэтому свойства, на которые вы должны смотреть, находятся в TextView - когда я впервые прочитал последнее предложение, я сделал двойной дубль :))
Ricket
15
Как примечание. Не все клавиатуры поддерживают стандартный атрибут android: imeOptions. Что действительно разочаровывает. Например, IME_ACTION_DONE определен как 6, где клавиатура HTC по умолчанию (На телефонах, таких как Incredible, Evo 4G) клавиша возврата определена как 0.
fernferret
13
Также, если вы используете imeOptions, убедитесь, что вы также используете inputType = "text" или другой эквивалент. Чтобы клавиатура слушала вас! Nexus1
Бланделл,
6
«Да» - Вы были бы более информативным, чем это? Он, вероятно, спросит, как реализовать решение.
Аль Ван
4
@AlWang: Во-первых, ваша проблемная область освещена в ответе (см. Начиная с «Вы захотите ...»). Во-вторых, это ответ от шести лет назад , и поэтому можно предположить, что проблема ОП была решена. В конце концов, ОП принял ответ.
CommonsWare
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
1
@RuchirBaronia Добавьте android: maxLines = "1" в ваш EditText. Ваш EditText не «двигается вниз», а вставляет разрыв строки во введенный текст. Установка maxLines на 1 предотвращает вставку разрыва строки.
Люстиг
3
Это решение работает только для аппаратных клавиатур, а не для программной / виртуальной клавиатуры. Если вы полагаетесь на него, то ваше приложение будет сломано для пользователей без подключенных клавиатур.
user3562927
12
Не в обиду CommonsWare, но его RTFM ответ был способ менее полезен , чем этот простой пример , показывающий , как именно это сделать. Спасибо!
Автономные приложения
1
@AutpendentApps, я часто вижу ответы CommonsWare. Ему повезло ответить с 2009 года, когда появился Android. Часто «да», «нет», «невозможно» и т. Д., Как правило, без кода. Часто его ответы устарели, поэтому я стараюсь не следовать его рекомендациям.
CoolMind,
215

Вот что ты делаешь. Он также скрыт в примере кода 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 для вашей кнопки «Отправить» (или «ОК», «Подтвердить», «Отправить», «Сохранить» и т. Д.).

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 и у меня есть android: imeOptions = "actionSend" в XML.
Bani
поиск 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

Аппаратные клавиатуры всегда дают входные события, но программные клавиатуры возвращают разные идентификаторы действий и нули в 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
  }
};

Внешний вид клавиши ввода по умолчанию в singleLine = false дает изогнутую стрелку ввода клавиатуры. Когда singleLine = true в последнем EditText, ключ говорит DONE, а в EditTexts перед ним - NEXT. По умолчанию это поведение одинаково для всех эмуляторов vanilla, android и google. Атрибут scrollHor horizontal не имеет значения. Нулевой тест важен, потому что ответ телефонов на программные входы оставлен на усмотрение производителя, и даже в эмуляторах ванильные эмуляторы уровня 16 отвечают на длинные программные входы в многострочном режиме и scrollHor Horizontal EditTexts с actionId NEXT и нулевым значением для событие.

earlcasper
источник
Когда я обновил Java, моя цепочка инструментов Android разорвалась. Это было 32-битное. Я переустановил все 64-битные и обнаружил, что сейчас доступно гораздо больше общедоступных версий эмулятора. Должен признать, что я знаю только то, что поведение EditorActionListener согласовано в эмуляторах, которые я тестировал.
Earlcasper
Когда я разместил это в своем блоге, кто-то заметил, что для того, чтобы оно работало на затмении, нужно изменить действие ime по умолчанию, добавив android: imeOptions = ”actionGo”.
Earlcasper
К сожалению, я неправильно прочитал комментарий к своему сообщению в блоге. Чтобы это работало в eclipse, вам нужно изменить действие ime по умолчанию, добавив android: imeOptions = ”actionGo”. в «EditText» в макете XML.
Earlcasper
Что касается дальнейших размышлений, мой последний комментарий относится и к Ant, и к Eclipse
earlcasper,
27

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

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;
    }
});
Майк
источник
21

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

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

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

Новичок
источник
Работал для меня, с добавлением IME_ACTION_DONE
htafoya
1
Прекрасно работает, если вы хотите отключить клавишу «Enter».
Диджей
16

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

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

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

kermitology
источник
16

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

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

Установите для атрибута типа ввода TextView в xml значение «текст»:

android:inputType="text"

Настройте метку клавиши «Ввод» на клавиатуре:

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

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

kaolick
источник
К сожалению, это не работает с новой версией 4 SwiftKey. И это опять сводит меня с ума ...: - /
kaolick
3
Ваш ЕСЛИ неверен. use: 'event.getKeyCode () == KeyEvent.KEYCODE_ENTER'
Loda
Идеально для меня. Также не забудьте вставить setImeActionLabel снова в оператор IF, иначе пользовательский текст исчезнет после первого нажатия.
Стив Роджерс
Его IF правильно, потому что он устанавливает свой actionId в KeyEvent.KEYCODE_ENTER выше :-D, но да, все остальные, вероятно, захотят использовать event.getKeyCode () == KeyEvent.KEYCODE_ENTER
Рэй Хулха,
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 назначит «actionDone» клавише EnterKey. Клавиша 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;
        }
    });
Zar E Ahmer
источник
По какой-то причине, когда я щелкаю enterпо своему тексту редактирования, весь текст редактирования перемещается вниз ... Как я могу это исправить?
Ruchir Baronia
Я думаю, что вы хотите узнать stackoverflow.com/questions/10978038/… иначе покажите мне свой xml
Zar E Ahmer
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;
LifeiSHot
источник
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!");
                    }
           }
          });
ORY
источник
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, а также добавьте это -> (android: imeOptions = "actionSearch") в xml EditText.
Санджит Прасад
3

Это прекрасно работает на телефонах LG Android. Это мешает ENTERи другим специальным символам интерпретироваться как нормальные символы. Кнопка Nextили Doneпоявляется автоматически и ENTERработает как положено.

edit.setInputType(InputType.TYPE_CLASS_TEXT);
Милан Швец
источник
Это единственная вещь, которая работала для меня. У меня есть Motorola Moto X 2, и обычно у него есть клавиша «Возврат» со стрелкой и все. Это изменило его на галочку, и я наконец смог заставить слушателя работать с этим. (До этого просто создал новую строку). Так что, если кто-то еще имеет эту проблему ...
мистическая кола
2

Вот простая статическая функция, которую вы можете добавить в свой класс 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;
        }
    };
}
JohnnyLambada
источник
Обратите внимание, что здесь используется лямбда-выражение, для которого требуется Java 1.8, но его достаточно просто преобразовать, чтобы не использовать лямбда-выражения. Однако проблема, с которой я сталкивался в решениях такого типа, заключается в том, что виртуальная клавиатура не скрывается автоматически, и если в полноэкранном режиме (небольшое устройство в альбомной ориентации) полноэкранный режим не отключается после нажатия пользователем
клавиши
2

InputType в текстовом поле должен соответствовать тому text, что, по словам CommonsWare, работает. Просто пробовал все это, нет inputType перед пробной версией и ничего не получалось, Enter продолжал регистрироваться как soft enter. После inputType = textэтого все, включая setImeLabel, сработало.

Пример : android:inputType="text"

Odaym
источник
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

Надежный способ ответить на <enter> в EditText - это TextWatcher , LocalBroadcastManager и BroadcastReceiver . Вам нужно добавить библиотеку поддержки v4, чтобы использовать LocalBroadcastManager. Я использую учебное пособие на vogella.com : 7.3 «Локальные широковещательные события с LocalBroadcastManager» из-за его полного лаконичного кода. Пример. В OnTextChanged прежде , чем это индекс конца изменения до изменения >; минус начать. Когда в 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
earlcasper
источник
Если используется какой-либо из типов ввода text * (например android:inputType="textCapSentences"), возврат каретки отфильтровывается из ввода, поэтому onTextChanged () не вызывается, когда пользователь нажимает клавишу Enter.
jk7
1

На этот вопрос пока нет ответа с Butterknife

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

И результат (показан в ландшафте):

введите описание изображения здесь

разработчик Android
источник
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()
}
Майкл
источник