Android - керуйте клавішею "Enter" в EditText


459

Мені цікаво, чи є спосіб обробляти натискання користувача Enterпід час набору тексту EditText, щось на кшталт події onSubmit HTML.

Також цікаво, чи існує спосіб маніпулювати віртуальною клавіатурою таким чином, щоб на кнопку "Готово" було позначено щось інше (наприклад, "Перейти") і виконувати певну дію при натисканні (знову ж таки, як onSubmit).


1
Котлін і розширення: тут дивіться: stackoverflow.com/a/48810268/1912924
Francesco Donzello

Відповіді:


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 за замовчуванням (На таких телефонах, як Неймовірно, Evo 4G) клавіша повернення визначається як 0.
fernferret

13
Крім того, якщо використання imOptions гарантує, що ви також використовуєте inputType = "текст" або інший еквівалент. Щоб клавіатура слухала вас! Nexus1
Blundell

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текст редагування, весь текст редагування переміщується вниз ... Як я можу це виправити?
Ручір Баронія

1
@RuchirBaronia Додати андроїд: maxLines = "1" у свій EditText. Ваш EditText не "рухається вниз", а скоріше вставляє розрив рядка у введений текст. Встановлення maxLines у 1 запобігає вставці лінії розриву.
люстиг

3
Це рішення працює лише для апаратних клавіатур, а не для м'якої / віртуальної клавіатури. Якщо ви покладаєтесь на нього, то ваш додаток буде розбито на користувачів без доданих клавіатур.
користувач3562927

12
Чи не в образу CommonsWare, але його RTFM відповідь була спосіб менш корисний , ніж цей простий приклад , який показує , як саме це зробити. Дякую!
AutonomousApps

1
@AutonomousApps, я часто бачу відповіді 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(){

Потім потрібно сказати слухачеві дві речі про те, що робити при натисканні кнопки повернення. Він повинен знати, про який редактор ми говоримо (тут я використовую 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.
Бані

шукаючи 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.
ашути

2
Це для мене спрацювало: if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}- не вдалося отримати жоден з інших підходів до роботи
Джонатан Елліс

38

Апаратні клавіатури завжди приносять події, але програмні клавіатури повертають різні діїID та нулі в 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. За замовчуванням така поведінка є послідовною для всіх емуляторів ванілі, андроїда та google. Горизонтальний атрибут scrollHorizontal не має ніякої різниці. Тест на нуль важливий, тому що реакція телефонів на м'які входи залишається виробнику, і навіть в емуляторах емулятори рівня 16 ванілі реагують на довгі м'які входи в багаторядкові та прокручувальні горизонтальні EditTexts з діїId NEXT та null для подія.


Коли я оновив Java, мій ланцюг інструментів Android зламався. Це було 32-бітне. Я перевстановив усе 64-бітне і виявив, що зараз доступно набагато більше версій публічного емулятора. Я мушу визнати, що мені відомо лише те, що поведінка EditorActionListener узгоджується з емуляторами, які я тестував.
Earlcasper

Коли я опублікував це у своєму блозі, хтось прокоментував, що для того, щоб він працював на затемнення, потрібно змінити дію за замовчуванням, додавши android: imeOptions = "actionGo".
Earlcasper

На жаль, я неправильно прочитав коментар до своєї публікації в блозі. Щоб він працював над затемненням, потрібно змінити дію за замовчуванням, додавши андроїд: imeOptions = "actionGo". до 'EditText' у макеті xml.
Earlcasper

У подальшому роздумі мій останній коментар стосується як Мурахи, так і затемнення
графа

27

На цій сторінці описано, як саме це зробити.

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

Встановіть android: imeOptions, тоді ви просто перевірите actionId в onEditorAction. Тож якщо ви встановите для параметра «Ім'яOptions» значення «actionDone», ви перевірите «onIditorAction» на «actionId == EditorInfo.IME_ACTION_DONE». Також обов’язково встановіть 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);

Це заважає нічого, крім тексту та простору. Я не міг розмістити вкладку "return" ("\ n") чи що-небудь.


Працював для мене, з додаванням IME_ACTION_DONE
htafoya

1
Відмінно працює, якщо ви хочете відключити клавішу "Enter".
deeJ

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

У мене було подібне призначення. Я хотів вирішити натискання клавіші "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 (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

        handled = true;
    }
    return handled;
    }
});

Я сподіваюсь, що це може допомогти іншим уникнути проблем, які у мене були, бо вони майже зводили мене з горіхів.


На жаль, це не працює з новою версією SwiftKey 4. І це мене знову
ганить

3
ваш ІФ невірний. використання: 'event.getKeyCode () == KeyEvent.KEYCODE_ENTER'
1313 року в Лоді

Ідеально підходить для мене. Також не забудьте знову вставити setImeActionLabel в оператор IF, інакше спеціальний текст зникне після першого натискання.
Стів Роджерс

Його ІФ є правильним, оскільки він встановлює свою діюId на KeyEvent.KEYCODE_ENTER вище :-D, але так, всі інші, ймовірно, захочуть використовувати event.getKeyCode () == KeyEvent.KEYCODE_ENTER
Ray Hulha

15

У своєму xml додайте атрибут editOxt

<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 призначить EnterKey "actionDone". EnterKey на клавіатурі зміниться з "Enter" на "Готово". Отже, коли натиснути клавішу 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текст редагування, весь текст редагування переміщується вниз ... Як я можу це виправити?
Ручір Баронія

Я думаю , що ви хочете дізнатися stackoverflow.com/questions/10978038 / ... othewise показати мені ваш XML
Джавад Зеб

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 і, як правило, він має клавішу "Return" зі стрілкою і все. Це змінило його на галочку, і я нарешті зміг змусити слухача працювати з цим. (До цього щойно створили новий рядок). Тож якщо у когось іншого виникає ця проблема ...
містична кола

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, але його досить просто перетворити, щоб не використовувати лямбда. Однак проблема, яку я бачив з такими рішеннями, полягає в тому, що віртуальна клавіатура не приховується автоматично, і якщо в повноекранному режимі (невеликий пристрій в альбомній орієнтації) режим повноекранного режиму не вимикається після натискання клавіші Enter або DONE
jk7

2

Введення тексту в текстовому полі має бути textдля того, щоб працювати, про що говорив CommonsWare. Просто спробував усе це, жодного вводуType до судового розгляду, і нічого не вийшло. Після цього 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 before - індекс кінця зміни перед зміною >; мінус початок. Коли в TextWatcher потік користувальницького інтерфейсу зайнятий оновленням редагуваного редагуючого редагуванняText, тому ми надсилаємо Намір розбудити 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

Якщо використовується будь-який із типів введення тексту * (наприклад android:inputType="textCapSentences"), то повернення каретки фільтрується з вхідного сигналу, тому onTextChanged () не викликається, коли користувач натискає клавішу Enter.
jk7

1

На це питання ще не отримали відповіді в Butterknife

РОЗМІР 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: WIN!
Хаві

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.