Подтвердить что ты не робот

Надежный способ узнать, когда уходит в отставку Android-клавиатура (обратный вызов, который работает на каждом телефоне)

Мы работаем над нашим первым Android-приложением, и до сих пор это был очень приятный опыт. Он почти завершен, но до выпуска у нас есть некоторые соображения, в основном о клавиатуре Android.

У нас есть пара полей EditText, которые используются для ввода чисел. Мы хотели бы зафиксировать событие, когда пользователь нажимает кнопку ввода, и делать некоторые расчеты и экономить на этом обратном вызове.

Проблема в том, что мы не получаем фиксированное событие, поскольку разные телефоны имеют разные клавиатуры. У некоторых есть кнопка "Готово", а у наших телефонов HTC есть кнопки 'Enter'. Мы попытались использовать imeOptions как "сделанные", но это не повлияло на телефоны HTC.

Мы также знаем, что клавиатура может быть уволена, нажав кнопку "Назад" . Поэтому мой вопрос заключается в том, есть ли надежный способ узнать, когда пользователь остановился, или когда клавиатура скрыта, точно так же, как textFieldShouldReturn callback в iphone sdk (который всегда срабатывает при смене клавиатуры, независимо от того, какой ключ заставлял его спускаться).

Другими словами, , как разработчик Android работает с мягкой клавиатурой. Я проверяю KeyEvent.KEYCODE_ENTER на событие editText onClick() и делаю мои задачи там. Он работает на моем Android-телефоне Android, но не на моем телефоне друзей Nexus, у которого есть кнопка, а не кнопка ввода. Там onClick даже не называется. Как разработчик справляется с этим?

РЕДАКТИРОВАТЬ: После потери половины моих волос и с помощью некоторых хороших друзей здесь

Я пробовал все ваши предложения, но в конце использование метода onEditorActionListener вместе с методом onKeyListener сделало трюк для меня. В onEdit обратном вызове onEditorActionListener я проверил KeyCode ACTION_DONE, который вызывался на клавиатурах с нажатой кнопкой. На клавиатурах, которые входят в onKey, вызывается. В методе onKey я также проверил KEYCODE_BACK, чтобы также можно было обработать событие резервного копирования оборудования. Я еще не обнаружил Android-устройство с готовым и введите на клавиатуру (серьезно), но я даже обработал этот случай флагом. Спасибо @Femi за предложение onEditorActionListener и спасибо всем друзьям за вашу помощь. Но ответ на мой оригинальный вопрос

Q: Есть ли надежный и простой способ узнать, как отключить мягкую клавиатуру Android (обратный вызов, который работает на каждом телефоне)

Ans: Нет, все предложенные здесь методы и все методы, предлагаемые на других сайтах, не являются простыми. И я думаю, что обработка события для клавиши возврата клавиатуры - самая простая вещь для любой операционной системы. Google, вы там?

4b9b3361

Ответ 1

Так как кажется, что вы ловите событие KEYCODE_ENTER, вы можете использовать это: http://developer.android.com/reference/android/widget/TextView.html#setOnEditorActionListener%28android.widget.TextView.OnEditorActionListener%29. Теоретически это позволит вам определить, какое действие конечного действия метода ввода (вне зависимости от того, вернется ли оно, введите или что-то еще) и ответьте на него.

Сообщите мне, если это сработает для вас.

Ответ 2

Вам также не нужно было бы выполнять эти вычисления, когда пользователь покидает TextView на аппаратной клавиатуре? Я бы не сосредоточился на клавиатуре, но на самом TextView. Если да, то, что вы, вероятно, хотите, setTransformationMethod

Вам нужно будет реализовать пользовательский TransformationMethod, в частности метод getTransformation, который преобразует исходную CharSequence в другую. Затем вы можете использовать onFocusChanged для применения этого только тогда, когда фокус потерян для этого TextView.

Ответ 3

Я не могу поверить, что Google не имеет независимого от клавиатуры обратного вызова для этого случая

Ничего себе, я не могу поверить в это. На данный момент у меня есть аналогичная проблема. В дополнение к IME ACTION я проверяю изменения фокуса на EditFields. Это нормально в большинстве случаев, но не будет работать всегда.

Я нашел способ получить уведомление, когда клавиатура скрыта, но это еще не полное решение (и я не уверен, что это хорошая идея), но у меня нет времени для продолжения прямо сейчас, поэтому я подумал, что могу отбросить начало этой идеи здесь:

Напишите свой собственный EditText (расширьте EditText) и переопределите onCreateInputConnection. В onCreateInputConnection вернуть свою собственную реализацию InputConnection (вы можете просто расширить BasicInputConnection. Метод InputConnections "finishComposingText()" всегда вызывается, когда клавиатура скрыта (также когда пользователь нажимает кнопку "назад" ).

Это код, и, возможно, у кого-то есть идея, почему введенный текст не отображается в этом поле редактирования; -)

public class MyEditText extends EditText{

public MyEditText(Context context) {
    super(context);
}

public MyEditText(Context context, AttributeSet attrs) {
    super(context);
}

public MyEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    System.out.println("onCreateInputConnection, "+outAttrs.actionId);
    return new MyInputConnection(this,true);
}

private class MyInputConnection extends BaseInputConnection{

    public MyInputConnection(View targetView, boolean fullEditor) {
        super(targetView, fullEditor);
    }

    @Override
    public boolean finishComposingText() {
        System.out.println("FINISH");
        return super.finishComposingText();
    }   
}
 }

Дж.П.М.

Ответ 4

Я нашел решение на этой странице SO: Кнопка перехвата назад с мягкой клавиатуры

Ответ от mhradek имеет 0 голосов, но кажется, что он работает.

Идея состоит в том, чтобы расширить базовый макет вашей деятельности, чтобы вы могли переопределить метод dispatchKeyEventPreIme и делать то, что вы хотите относительно переданного KeyEvent. Обратите внимание, что вы отвечаете за управление мягкой клавиатурой.

Я использую его, и я могу определенно перехватить нажатие клавиш (например, кнопку "Назад" ) без "мягкой" клавиатуры. Мне еще предстоит сыграть больше с ним, чтобы увидеть, что возможно, а что нет.

Надеюсь, это поможет.

Ответ 5

Пробовали ли вы реализовать пользовательское представление EditText, где вы переопределяете dispatchKeyEventPreIme? Так же, как в ответе, опубликованном Арно (ссылка кнопка перехвата назад с мягкой клавиатуры), но вместо использования пользовательского макета используйте собственный EditText и переопределите:

@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
    if(KeyEvent.KEYCODE_BACK == event.getKeyCode()) {
       //this hides soft keyboard in super.dispatchKeyEventPreIme(event)
    }
    return super.dispatchKeyEventPreIme(event);
}

Я предложил это решение в этом вопросе

Ответ 6

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

//    From an activity, you can call

if (getResources().getConfiguration().keyboardHidden == Configuration.KEYBOARDHIDDEN_YES) {
// your code here
}

Ответ 7

Этот код отлично работает для меня с HTC и клавиатурой Android по умолчанию:

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                // handle enter key on keyboard
                if (actionId == EditorInfo.IME_ACTION_SEND || 
                        (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) {
                    if (uid != null) {
                        // hide keyboard
                        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                        // perform other stuff

                        return true;
                    }
                }
                return false;
            }
        });

В XML файле editText используется следующее:

android:imeOptions="actionSend"

Конечно, вы также можете использовать что-то еще, например send, просто убедитесь, что изменили его как в коде XML, так и в Java.