2014-12-12 11 views
6

Versione breve della domanda: come posso catturare l'evento di pressione lunga su input/tastiera software in Android?Android: come catturare l'evento di stampa lunga su input/tastiera software?

Versione lunga: In un'applicazione Android, abbiamo un multi-linea di EditText, e vogliamo avere questo comportamento: 1. Per impostazione predefinita, è che mostra un pulsante FATTO, toccandolo, ingresso morbido/tastiera essere chiuso 2. Se l'utente preme a lungo il pulsante DONE, il suo comportamento verrà modificato in ENTER e ci sarà una nuova riga in EditText.

Per requisito # 1, ho usato la soluzione qui: https://stackoverflow.com/a/12570003/4225326

Per requisito # 2, la domanda di blocco che ho è, come catturare la lunga conferenza stampa. Ho impostato onEditorActionListener, ma l'evento catturato è nullo: http://developer.android.com/reference/android/widget/TextView.OnEditorActionListener.html Ho cercato il documento, il metodo relativo alla pressione lunga è per la tastiera complessa: http://developer.android.com/reference/android/view/View.html#onKeyLongPress(int, android.view.KeyEvent), non riesco a trovarne uno per l'input/tastiera .

Grazie per l'esame di questa domanda.

+0

Hai cercato di aggiungere un 'doneButton.setOnLongClickListener (nuova OnLongClickListener() {...});' – k3b

risposta

0

Non ho trovato questa risposta da solo, quindi ho codificato manualmente la soluzione. Ho utilizzato un timer sugli eventi onPress() e onRelease() dello KeyboardView.OnKeyboardActionListener. Ecco il codice importante. Molti TRY/CATCHes hanno lasciato per brevità. In inglese, quando viene premuto un tasto, sto avviando un timer che attende nello stesso momento in cui un evento con clic lungo normalmente attende (ViewConfiguration.getLongPressTimeout()), quindi esegue un evento on-long-click sul thread originale. Rilasci chiave successivi e pressioni dei tasti possono annullare qualsiasi timer attivo.

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 
    } 
+0

Io non sono così sicuro la soluzione funzionerà come previsto. Secondo la documentazione, onPress() viene chiamato prima onKey() una volta e onRelease viene chiamato dopo onKey(). Ciò significherebbe che onKey verrà eseguito indipendentemente da cosa. Se la soluzione è implementata, per la lunga pressione, verranno eseguiti sia il comportamento normale della chiave che il comportamento a pressione lunga. – flide

+0

Un altro problema che posso visualizzare è: "dove devo impostare e come posso recuperare il codice tasto premuto a lungo?". Ciò sarà particolarmente fastidioso in quanto la struttura nel xml non prevede tali scenari. Qualche commento? – flide

Problemi correlati