programacion - Android: ¿cómo capturar evento de pulsación larga en entrada suave/teclado?
manual android studio avanzado (1)
No pude encontrar esta respuesta yo mismo, así que codifiqué manualmente la solución. onRelease()
un temporizador en los eventos onPress()
y onRelease()
de KeyboardView.OnKeyboardActionListener
. Aquí está el código importante. Muchos TRY / CATCH se omiten por brevedad. En inglés, cuando se presiona una tecla, empiezo un temporizador que espera al mismo tiempo que un evento de clic largo que normalmente espera ( ViewConfiguration.getLongPressTimeout()
), luego ejecuta un evento de clic largo en el hilo original. Las liberaciones de tecla posteriores y las pulsaciones de tecla pueden cancelar cualquier temporizador activo.
public class MyIME
extends InputMethodService
implements KeyboardView.OnKeyboardActionListener {
:
:
private Timer timerLongPress = null;
:
:
@Override
public void onCreate() {
super.onCreate();
:
:
timerLongPress = new Timer();
:
:
}
@Override
public void onRelease(final int primaryCode) {
:
:
timerLongPress.cancel();
:
:
}
@Override
public void onPress(final int primaryCode) {
:
:
timerLongPress.cancel();
:
:
timerLongPress = new Timer();
timerLongPress.schedule(new TimerTask() {
@Override
public void run() {
try {
Handler uiHandler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
MyIME.this.onKeyLongPress(primaryCode);
} catch (Exception e) {
Log.e(MyIME.class.getSimpleName(), "uiHandler.run: " + e.getMessage(), e);
}
}
};
uiHandler.post(runnable);
} catch (Exception e) {
Log.e(MyIME.class.getSimpleName(), "Timer.run: " + e.getMessage(), e);
}
}
}, ViewConfiguration.getLongPressTimeout());
:
:
}
public void onKeyLongPress(int keyCode) {
// Process long-click here
}
Versión corta de la pregunta: ¿cómo puedo capturar evento de pulsación larga en entrada suave / teclado en Android?
Versión larga: en una aplicación de Android, tenemos un EditText multilínea, y queremos tener este comportamiento: 1. De forma predeterminada, muestra un botón HECHO, al tocarlo, se cerrará la entrada suave / teclado. 2. Si el usuario presiona prolongadamente el botón HECHO, su comportamiento se cambiará al botón ENTER, y habrá una nueva línea en EditText.
Para el requisito n. ° 1, utilicé la solución aquí: https://stackoverflow.com/a/12570003/4225326
Para el requisito n. ° 2, la pregunta de bloqueo que tengo es cómo capturar el evento de pulsación larga. Configuré onEditorActionListener, pero el evento capturado es nulo: http://developer.android.com/reference/android/widget/TextView.OnEditorActionListener.html Busqué en el documento, el método relacionado con la pulsación larga es para el teclado duro: http: //developer.android.com/reference/android/view/View.html#onKeyLongPress(int , android.view.KeyEvent), no puedo encontrar uno para entrada / teclado.
Gracias por investigar esta pregunta.