Знаючи, коли редагувати текст, редагується


74

Як я знаю, коли мій текст редагування закінчується редагуванням? Наприклад, коли користувач вибирає наступне поле або натискає кнопку "Готово" на м'якій клавіатурі.

Я хочу це знати, щоб затиснути вхід. Схоже, afterTextChanged спостерігача за текстом відбувається після введення кожного символу. Мені потрібно зробити деякі обчислення з введенням, тому я б хотів уникати обчислень після введення кожного символу.

Дякую

Відповіді:


107

Використовуючи щось подібне

 meditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            switch (actionId){
                case EditorInfo.IME_ACTION_DONE:
                case EditorInfo.IME_ACTION_NEXT:
                case EditorInfo.IME_ACTION_PREVIOUS:
                    yourcalc();
                    return true;
            }
            return false;
        }
    });

Добре, ваші і відповіді Річа здаються мені потрібними, дякую. Чи є спосіб розфокусувати editText, коли користувач звертається до цього методу? Я спробував v.clearfocus, але, здається, це нічого не робить ... Якби я міг розфокусуватись, то він просто передав би дію слухачеві, що змінює фокус.
Matt

1
@Matt: Я думаю, проблема в тому, що кнопка не привертає увагу? Я реалізував процедуру, коли кнопка розсудливо захоплювала фокус на клік (я думаю, що метод називається requestFocus). Тому що, якщо кнопка захопить фокус, ваше Текстове поле втратить його, і все буде добре.
AgentKnopf

якщо після редагування тексту в edittext користувач натискає назад, а не кнопку готово в програмному введенні. тоді що трапиться? у такому випадку метод yourcalc () викликаний чи ні?
Brijesh Patel

Чи буде це також враховувати подію при ручному перемиканні фокусу на інший вигляд?
mr5

1
Ви також можете обробляти такі дії, як: EditorInfo.IME_ACTION_NEXTі IME_ACTION_PREVIOUS. Я щойно відредагував відповідь, додавши їх до коду
Костанос,

42

EditTextнаслідує, setOnFocusChangeListenerщо вимагає реалізації OnFocusChangeListener.

Реалізуйте onFocusChangeі є логічний параметр для hasFocus. Коли це хибно, ви втратили фокус на іншому контролі.

РЕДАГУВАТИ

Для обробки обох випадків - редагуйте текст, втрачаючи фокус АБО натискає кнопку "готово" - створіть єдиний метод, який викликається від обох слухачів.

    private void calculate() { ... }

    btnDone.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            calculate();
        }
    });

    txtEdit.setOnFocusChangeListener(new OnFocusChangeListener() {          

        public void onFocusChange(View v, boolean hasFocus) {
            if(!hasFocus)
                calculate();
        }
    });

Добре, це працює, але лише тоді, коли користувач натискає щось інше. Чи є спосіб виявити, коли користувач також натискає готово? РЕДАГУВАТИ: або розфокусуйте, коли користувач натискає готово.
Matt

1
Так. Просто попросіть EditFext OnFocusChangeListener і OnClickListener кнопки викликати той самий метод обчислення. Я відредагував свою відповідь, включивши цей код. ^
Багатий

Додавання 'android: imeOptions = "actionNext"' до xml txtEdit призвело до втрати фокусу, коли на моєму Samsung Galaxy було натиснуто програмну клавіатуру NextKey. Додаючи 'txtEdit.setOnKeyListener (новий OnKeyListener () {' до onCreate (), емулятор, який не реагує на клавіатуру з використанням м'якої клавіатури, відповідає на EnterKey.
Earlcasper,

15

Використовуючи об’єкт EditText xml, визначений таким чином:

    <EditText
        android:id="@+id/create_survey_newquestion_editText_minvalue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:ems="4"
        android:imeOptions="actionDone"
        android:inputType="number" />

Ми можемо захопити його текст i) коли користувач натискає кнопку Готово на м'якій клавіатурі (OnEditorActionListener) або ii) коли EditText втрачає фокус користувача (OnFocusChangeListener), який зараз знаходиться на іншому EditText:

    /**
     * 3. Set the min value EditText listener
     */
    editText= (EditText) this.viewGroup.findViewById(R.id.create_survey_newquestion_editText_minvalue);
    editText.setOnEditorActionListener(new OnEditorActionListener()
    {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
        {
            String input;
            if(actionId == EditorInfo.IME_ACTION_DONE)
            {
                input= v.getText().toString();
                MyActivity.calculate(input);
                return true; // consume.
            }
            return false; // pass on to other listeners.
        }
    });
    editText.setOnFocusChangeListener(new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View v, boolean hasFocus)
        {
            String input;
            EditText editText;

            if(!hasFocus)
            {
                editText= (EditText) v;
                input= editText.getText().toString();
                MyActivity.calculate(input);
            }
        }
    });

Це працює для мене. Ви можете приховати програмну клавіатуру після обчислень, використовуючи такий код:

private void hideKeyboard(EditText editText)
{
    InputMethodManager imm= (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}

Редагувати: додано повернені значення до onEditorAction


3

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

        editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                EditText editText = (EditText) v;
                String text = editText.getText().toString();
             }
        }
    });

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.