2016-03-31 31 views
11

Ho EditText che viene utilizzato per immettere contenuti sui messaggi (e-mail, sms). Voglio che il messaggio venga immediatamente pubblicato sul pulsante del pulsante ActionDone. Io uso seguente codice per questo:Come implementare Multiline EditText con il pulsante ActionDone (senza pulsante Invio)

message.setOnEditorActionListener((textView, i, keyEvent) -> { 
      switch (i) { 
       case EditorInfo.IME_ACTION_DONE: 
        if (messageCanBePosted()) { 
         SoftKeyboard.hide(message); 
         postMessage(); 
         return true; 
        } else { 
         return false; 
        } 
       default: 
        return false; 
      } 
     }); 

Ma anche io voglio questo campo messaggio sia più righe, come in tutte le altre applicazioni di messaggistica. Posso raggiungere con questa linea:

android:inputType="textMultiLine" 

Il problema è che dopo l'aggiunta di questa riga tasto ActionDone comincia ad agire come il tasto Invio. Quindi il mio callback per la cattura di EditorInfo.IME_ACTION_DONE non viene mai chiamato. Quindi ogni volta che l'utente preme il cursore del pulsante si sposta su una nuova riga invece di inviare un messaggio.

Come è possibile mantenere il comportamento su più righe di EditText (possibilità di mostrare testo su più righe) e il pulsante ActionDone?

risposta

24

Infine, dopo aver cercato qui per thread simili ho trovato una soluzione. Solo bisogno di aggiungere queste righe sul vostro Attività/Frammento:

editText.setHorizontallyScrolling(false); 
editText.setMaxLines(Integer.MAX_VALUE); 

Per qualche ragione non funziona se si applica esattamente la stessa impostazione da XML. Dovresti farlo a livello di programmazione.

C'è anche un'altra soluzione possibile - derivare da EditText e applicare EditorInfo.IME_ACTION_DONE manualmente. Ma per me la prima soluzione sembra più semplice.

+0

Sei sicuro che questo ha funzionato? Non riesco a farlo funzionare – silverFoxA

+0

@silverFox sì, ha funzionato per me. Quali proprietà definisci per il tuo EditText in xml? – Ruslan

+0

Grazie ha funzionato – silverFoxA

13

Continua Ruslan risposta. Il trucco ha funzionato, ma c'è una cosa in più di cui devi occuparti in XML.

EditText dovrebbe avere il tipo di ingresso text altrimenti actionDone non funzionerà. Tipo di input predefinita di EditText fa permette all'utente di linea di ingresso rompe così InputType deve essere impostato su text cioè

android:inputType="text" 
//And of course 
android:imeOptions="actionDone" 

E nella classe Java è necessario aggiungere:

editText.setHorizontallyScrolling(false); 
+0

inputType = text & imeOptions = actionDone in xml e setHorizontallyScrolling() nel codice lo ha fatto! Grazie, finalmente. – Borzh

15

Usa

editText.setImeOptions(EditorInfo.IME_ACTION_DONE); 
editText.setRawInputType(InputType.TYPE_CLASS_TEXT); 

e in XML:

android:inputType="textMultiLine" 

Fonte: Multi-line EditText with Done action button

+1

Solo questo ha funzionato per me e ha funzionato come un incantesimo: il pulsante Fine visualizzato e funzionante, solo una singola linea visibile quando un EditText è inizialmente vuoto ed espandibile a più linee quando un utente digita O c'è più testo aggiunto inizialmente dal codice (setText). – javaxian

+5

Sarebbe stato bello citare la fonte: http://stackoverflow.com/a/41022589/4607733 – horcrux

+1

Grazie, dopo aver cercato per ore, avevi ragione, non funziona cambiando xml. Che casino ... – Annihil