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

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 и нулевым значением для событие.


Когда я обновил 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 информацию о повторении событий действия (удержание клавиши ввода) и т. Д.


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

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


К сожалению, это не работает с новой версией 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;
        }
    });

По какой-то причине, когда я щелкаю 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;

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, а также добавьте это -> (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;
        }
    };
}

Обратите внимание, что здесь используется лямбда-выражение, для которого требуется Java 1.8, но его достаточно просто преобразовать, чтобы не использовать лямбда-выражения. Однако проблема, с которой я сталкивался в решениях такого типа, заключается в том, что виртуальная клавиатура не скрывается автоматически, и если в полноэкранном режиме (небольшое устройство в альбомной ориентации) полноэкранный режим не отключается после нажатия пользователем
— клавиши

2

InputType в текстовом поле должен соответствовать тому text, что, по словам CommonsWare, работает. Просто пробовал все это, нет inputType перед пробной версией и ничего не получалось, Enter продолжал регистрироваться как soft 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

Надежный способ ответить на <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

Если используется какой-либо из типов ввода 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" />

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

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


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()
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.