2012-01-12 14 views
10

Se imposto SingleLine = true su un widget EditText, ottengo un controllo di modifica a riga singola che non consente all'utente di inserire ritorni rigidi (facendo clic su Invio si passa a il campo successivo invece di inserire una nuova riga). Se non imposto SingleLine = true, l'utente può inserire ritorni rigidi.Android EditText con word-wrap ma nessun ritorno hard

Se imposto layout_height = "wrap_content", il controllo EditText crescerà verticalmente per mostrare tutto il testo. Tuttavia, lo fa solo se SingleLine non è impostato su true.

Quindi, la mia domanda è, è possibile ottenere il word-wrapping e il ridimensionamento verticale, senza consentire all'utente di inserire interruzioni di linea dura? Suppongo che potrei intrappolare il tasto Invio, ma poi dovrei anche prendere altri modi in cui potrebbero trovarne uno (copia/incolla, non so cos'altro?). C'è un modo semplice per farlo con la giusta combinazione di proprietà?

Preferisco il word-wrap in cui l'utente può vedere tutto il testo, rispetto allo scorrimento orizzontale di un controllo di modifica su una riga, ma non voglio che pensino che possono inserire testo multilinea (e io non voglio doverlo supportare). Credo che potrei semplicemente convertire i ritorni rigidi in spazi quando salvi i dati nel mio database, se necessario (l'app legacy che sincronizzo questi dati sul PC non può gestire ritorni difficili).

risposta

12

Anch'io stavo cercando qualcosa per fare anche questo. L'unica soluzione che ho trovato è stato quello di estendere l'EditText come segue:

package com.kylemilligan.test; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.inputmethod.EditorInfo; 
import android.view.inputmethod.InputConnection; 
import android.widget.EditText; 

public class NoNewlineEditText extends EditText 
{ 

    public NoNewlineEditText(Context context) { 
     super(context); 
    } 

    public NoNewlineEditText(Context context, AttributeSet attributeSet) { 
     super(context, attributeSet); 
    }  

    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) 
    { 
     InputConnection connection = super.onCreateInputConnection(outAttrs); 
     int imeActions = outAttrs.imeOptions & EditorInfo.IME_MASK_ACTION; 
     if ((imeActions & EditorInfo.IME_ACTION_DONE) != 0) 
     { 
      // clear the existing action 
      outAttrs.imeOptions ^= imeActions; 
      // set the DONE action 
      outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE; 
     } 
     if ((outAttrs.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) 
     { 
      outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; 
     } 
     return connection; 
    } 
} 

E allora in uso di XML come:

 <com.kylemilligan.test.NoNewlineEditText 
      android:id="@+id/noNewLineText" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="top|left" 
      android:imeOptions="actionDone" 
      android:minLines="5" /> 

Spero che questo aiuti!

+0

Così utile. Non so perché questo non è offerto come comportamento integrato. – JulianSymes

+6

Funziona perché Android imposta automaticamente 'EditorInfo.IME_FLAG_NO_ENTER_ACTION' su viste di testo multilinea. Puoi semplificare questo: 'Connessione InputConnection = super.onCreateInputConnection (outAttrs); outAttrs.imeOptions & = ~ (EditorInfo.IME_FLAG_NO_ENTER_ACTION); connessione di ritorno; ' – Foxichu

3

Mi interessava e mi sono reso conto che l'app di messaggistica Android incorporata ha inserito del testo senza il tasto Invio sulla tastiera virtuale. Secondo il layout sorgente here, è fatto con le seguenti opzioni. Non tutti sono necessari; Credo che la chiave è di avere textShortMessage, textMultiLine, e flagNoEnterAction:

android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine" 
android:imeOptions="actionSend|flagNoEnterAction" 
+0

Questa è una soluzione migliore rispetto ad altre che ho visto. – bond

+0

Quasi. Non ho potuto usare questa soluzione perché non sembra permettermi di usare 'actionDone'. Non voglio emoji o qualsiasi altra cosa del genere; Voglio solo un'azione "fatta" e non riesco a farlo funzionare con questa soluzione. –

0
editText.setImeOptions(EditorInfo.IME_ACTION_DONE); 
//This will treat Enter as Done instead of new line: 
editText.setRawInputType(InputType.TYPE_CLASS_TEXT); 

And in XML: 
android:inputType="textMultiLine"