2012-05-16 9 views
6

So che ci sono molte domande correlate in Stackoverflow, ma ho provato a fare tutto ciò che è scritto in ognuna di esse e finora non sono riuscito a farlo funzionare.EditText non avvolgerà il suo testo

Il mio problema è semplice. Ho un'applicazione Android, e ho una casella in cui l'utente inserirà il testo. Tuttavia, non voglio che questo testo sia multilinea (non dovrebbe avere "\ n" in esso), ma voglio che vada a capo se la dimensione della linea è maggiore della finestra. Quindi, in sostanza, quello che voglio è lo stesso comportamento che ha il campo TextBox su Oggetto Gmail.

Questa è tutta la mia vista:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

<TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/question" 
     android:textAppearance="@style/titleFont"/> 

<EditText 
    android:id="@+id/edit_question_value" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="0.3" 
    android:gravity="top" 
    android:inputType="textImeMultiLine|textEmailSubject" 
    android:maxLength="70" 
     > 

</EditText> 

<TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/answer" 
     android:textAppearance="@style/titleFont"/> 

<EditText 
     android:id="@+id/edit_question_answer" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:gravity="top" 
     android:layout_weight="0.7" 
     android:inputType="textMultiLine"/> 

<LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal"> 

    <Button 
      android:id="@+id/save_question" 
      android:layout_width="120dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:layout_weight="0.5" 
      android:text="@string/save"/> 

    <Button 
      android:id="@+id/cancel_edit_question" 
      android:layout_width="120dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.5" 
      android:text="@string/cancel"/> 
</LinearLayout> 

Il testo che voglio avere questo comportamento è theone con l'id è uguale a @ + id/edit_question_value. Finora, sono stato in grado di renderlo veramente multilinea (in modo che l'utente possa digitare se lo desidera) o su una sola riga e il testo non verrà avvolto. Forse alcuni degli elementi attorno al testo stanno avendo delle interferenze, ed è per questo che ho incluso l'intera visione.

Qualcuno sa cosa sta succedendo?

risposta

8

Questo è qualcosa che ha disturbato molte persone prima e ho potuto trovare una risposta quando ne avevo bisogno. In puro XML, cioè. Se possiamo usare la programmazione e non solo il markup, possiamo farlo con un piccolo mod se puoi. Fondamentalmente stiamo dichiarando un editText multiLine e poi prendiamo la chiave di ritorno per evitare nuove righe.

In primo luogo la dichiarazione in xml :

<EditText 
    android:id="@+id/noReturnEditText" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:imeOptions="actionDone" 
    android:inputType="textMultiLine|textCapSentences" 
    android:text="lorem ipsum \n dolor site amet helping stackoverflow" /> 

Sì, lo so cosa state pensando "Ma hey, Juan questo è un multiliner EditText e io voglio uno di linea, come sul tema area di gmail ". Lo so, lo so, ma ci penseremo noi adesso, rimuovendo il comportamento della parte multilinea che non vogliamo, mentre manteniamo il testo a capo ci vuole il .

Ora il resto del Codice:

EditText noReturnEditText = (EditText) findViewById(R.id.noReturnEditText); 
     noReturnEditText.setOnKeyListener(new OnKeyListener(){ 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if (keyCode == KeyEvent.KEYCODE_ENTER) return true; 
       return false; 
      } 
     }); 

Probabilmente si può leggere il codice abbastanza facilmente, ma nel caso in cui qualcuno ha bisogno di una spiegazione, stiamo impostando un OnKeyListener al EditText vogliamo essere " oneline-multilinelike "e se l'utente preme la chiave di ritorno (KEYCODE_ENTER) diciamo che l'evento non si propaga restituendo true che in questo contesto significa che abbiamo gestito l'evento.

Risultato:

enter image description here

Considerazioni

La pressione del tasto di ritorno non è l'unico modo di entrare in una nuova linea. L'utente può copiare/incollare del testo e finire con una voce su più righe in un EditText a riga singola. Non ti preoccupare!Siamo in grado di spogliare il valore prima abbiamo memorizzare o usarlo con qualcosa di simile

myData = rawText.replace(System.getProperty("line.separator"), " ");

Che cosa succede se ho un sacco di EditText vista?

Bene, in pratica hai due opzioni. Fatelo uno alla volta e estraete gli occhi da o da facendo qualcosa di simile, elencando le viste e il ciclo per ogni vista.

//Declare the reusable listener 
    OnKeyListener myListener = new OnKeyListener(){ 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_ENTER) return true; 
      return false; 
     } 
    } 
//Loop through the views 
    int viewIds[] = {R.id.edittext1,R.id.edittext2,R.id.edittext3,R.id.edittext4}; 
    for(int id : viewIds) ((EditText)findViewById).setOnKeyListener(myListener); 
Problemi correlati