Надежный способ узнать, когда уходит в отставку 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, вы там?
Ответы
Ответ 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.