studio programacion para herramientas fundamentos desarrollo con avanzado aplicaciones android android-edittext android-input-method

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.