Android setOnEditorActionListener() не срабатывает

Я пытаюсь установить прослушиватель на EditText, когда будет нажата кнопка ввода. Но он вообще не сработал. Я тестировал это на LG Nexus 4 с Android 4.2.2. setOnEditorActionListener работает на Amazon Kindle Fire с Android 2.3, а setImeActionLabel нигде! Я также не могу установить текст для кнопки Enter. Вот код:

mEditText.setImeActionLabel("Reply", EditorInfo.IME_ACTION_UNSPECIFIED);
mEditText.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId,
                KeyEvent event) {
            Log.d("TEST RESPONSE", "Action ID = " + actionId + "KeyEvent = " + event);
            return true;
        }  
    });

Что я делаю не так? Как я могу это исправить?


person MainstreamDeveloper00    schedule 23.05.2013    source источник


Ответы (9)


Вы можете использовать TextWatcher.

editText.addTextChangedListener(new TextWatcher() {
    
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }
        
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }
        
    @Override
    public void afterTextChanged(Editable s) {
        if (s.charAt(s.length() - 1) == '\n') {
              Log.d("TAG", "Enter was pressed");
        }
    }
});
person Dmitry Guselnikov    schedule 23.05.2013
comment
Спасибо, это работает. Но разве вы не знаете, почему .setImeActionLabel и setOnEditorActionListener не работают на Nexus 4, но работают на других устройствах? - person MainstreamDeveloper00; 23.05.2013
comment
Магия фрагментации Android. Для моего Galaxy Nexus они тоже не работают - person Dmitry Guselnikov; 23.05.2013
comment
Для меня imeOptions работал только в том случае, если вы установили singleLine=true в EditText. Кажется странным и раздражающим, что может быть задумано, но это то, что я нашел. - person speedynomads; 19.12.2014
comment
Для меня это не работает, даже после добавления singleLine=true в атрибуты ET. Устройства, которые я заметил, — это Nexus 6, Nexus 4 и Moto G. Общее сходство — это Android 5.0! Так что, если кто-то столкнется с такой же проблемой. дайте ответ пожалуйста. - person sud007; 21.04.2015
comment
Для Котлина условие будет таким: if(s[s.length - 1] == '\n') - person Lilia; 26.11.2019

Убедитесь, что в файле макета установлен IME_ACTION:

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

Полное объяснение см. на странице http://developer.android.com/guide/topics/ui/controls/text.html.

person BeccaP    schedule 07.10.2014
comment
И эта строка: android:inputType=text - person Kai Wang; 29.01.2016

Что сработало для меня, так это то, что я добавил эту строку ниже в EditText

android:imeOptions="actionSend"

эта строка делает клавиатуру, которая появляется при нажатии на текст редактирования, имеет кнопку отправки вместо поиска

в setOnEditorActionListener вы переопределяете следующий метод, который ищет действие отправки

@Override
    public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
        if (actionId == EditorInfo.IME_ACTION_SEND) {
        //implement stuff here
          }
        }
person Abhilash Reddy    schedule 19.12.2017

В файле xml добавьте тег android:inputType="text" в EditText

person Nakul    schedule 28.06.2018
comment
Добавьте еще android:imeOptions="actionSend" - person Nakul; 28.06.2018

Я использую следующий код

<EditText
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_toRightOf="@id/ic_magnify"
    android:layout_centerVertical="true"
    android:textSize="15sp"
    android:textColor="#000"
    android:id="@+id/input_search"
    android:inputType="text"
    android:background="@null"
    android:hint="Enter Address, City or Zip Code"
    android:imeOptions="actionSearch"/>

mSearchText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent keyEvent) {

                if(actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE
                        || keyEvent.getAction() == KeyEvent.ACTION_DOWN || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER){

                        geoLocate();

                }

                return false;
            }
        });
person Dinesh    schedule 02.11.2018

Вы можете попробовать это, чтобы использовать OnKeyListener

editText.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int actionId, KeyEvent event) {
            Log.d("TEST RESPONSE", "Action ID = " + actionId + "KeyEvent = " + event);
            return false;
        }
    });
person vmathieu    schedule 23.05.2013
comment
У меня есть это в моем логарифме: ID действия = 66KeyEvent = KeyEvent { action = ACTION_UP, keyCode = KEYCODE_ENTER, scanCode = 0, metaState = 0, flags = 0x6, RepeatCount = 0, eventTime = 653776952, downTime = 653776952, deviceId = — 1, source=0x0 } и я использую свой код - person vmathieu; 23.05.2013
comment
Прочитайте документы для View.OnKeyListener, это полезно только для аппаратных клавиатур; метод ввода программного обеспечения не обязан запускать этот прослушиватель. developer.android.com/reference/android/view/ - person speedynomads; 22.12.2014

Я понял, он работает с Edittext в действии, но не во фрагменте.

<EditText
                android:id="@+id/mEditText"
                android:imeOptions="actionSearch"
                android:imeActionLabel="搜索"
                android:inputType="text"
                android:singleLine="true"
                android:textSize="18dp"
                android:paddingTop="5dp"
                android:paddingBottom="5dp"
                android:paddingLeft="3dp"
                android:paddingRight="3dp"
                android:textColor="@color/black"
                android:layout_marginTop="7dp"
                android:layout_marginBottom="7dp"
                android:shadowColor="#4b000000"
                android:shadowDy="1"
                android:shadowDx="1"
                android:shadowRadius="1"
                android:cursorVisible="true"
                android:textCursorDrawable="@null"
                android:gravity="center_vertical|left"
                android:background="@color/transparent"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                tools:ignore="UnusedAttribute">
            <requestFocus/>
        </EditText>


mEditText.setImeActionLabel("搜索", EditorInfo.IME_ACTION_SEARCH);
    mEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                MToastUtil.show("搜索");
            }
            return false;
        }
    });
person Michael Mao    schedule 12.04.2015

убедиться:

тип ввода = "текст";

imeOptions = "отправить действие";

person Kai Wang    schedule 29.01.2016

После небольшого поиска - это было решение для меня (также работает во фрагменте):

Просто удалите imeAction

person Itay Sued    schedule 30.06.2015