2012-05-16 21 views
6

Sé que hay muchas preguntas relacionadas en Stackoverflow, pero traté de hacer todo lo que está escrito en ellas y hasta ahora no pude hacer que esto funcionara.EditText no ajustará su texto

Mi problema es simple. Tengo una aplicación de Android, y tengo una caja donde el usuario ingresará el texto. Sin embargo, no quiero que este texto sea multilínea (no debería tener "\ n" en él), pero quiero que se ajuste si el tamaño de la línea es mayor que la ventana gráfica. Básicamente, lo que quiero es el mismo comportamiento que el campo de texto de la casilla de Gmail.

Ésta es toda mi punto de 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> 

El texto que desea tener este comportamiento es theone con el id es igual a @ +/Identificación del edit_question_value. Hasta ahora, he sido capaz de hacerlo verdaderamente multilínea (para que el usuario pueda escribir enter si así lo desea) o una línea y el texto no se ajusta. Quizás algunos de los elementos que rodean el texto tienen alguna interferencia, y es por eso que incluí toda la vista.

¿Alguien sabe lo que está pasando?

Respuesta

8

Esto es algo que ha molestado a mucha gente antes y podría encontrar una respuesta cuando lo necesitara. En XML puro, eso es. Si podemos usar la programación y no solo el marcado, podemos hacerlo con un pequeño hackear si es posible. Básicamente estamos declarando un editText multiLine y luego capturando la tecla de retorno para evitar nuevas líneas.

En primer lugar la declaración de 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í, sé lo que estás pensando "Pero bueno, Juan esta es una multiliner EditText y quiero un chiste, como en el tema área de gmail ". Lo sé, lo sé, pero vamos a encargarnos ahora, al eliminar el comportamiento de la parte de línea múltiple que no queremos, mientras mantenemos el ajuste de texto que hacemos queremos.

Ahora el resto del código :

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; 
      } 
     }); 

probablemente Usted puede leer el código con bastante facilidad, pero en caso de que alguien necesita una explicación, estamos estableciendo una OnKeyListener a la EditText queremos ser " oneline-multilinelike "y si el usuario presiona la tecla de retorno (KEYCODE_ENTER) le indicamos al evento que no se propague al devolver true, lo que en este contexto significa que hemos manejado el evento.

Resultado:

enter image description here

Consideraciones

Al pulsar la tecla de retorno no es la única manera de entrar en una nueva línea. El usuario puede copiar/pegar texto y terminar con una entrada de varias líneas en una sola línea EditText. ¡No te preocupes!Podemos quitar el valor antes de la almacenamos o utilizamos con algo como

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

¿Qué pasa si tengo un montón de EditText puntos de vista?

Bueno, básicamente tiene dos opciones. Hazlo uno por uno y saca los ojos o haz algo como esto, enumerando las vistas y el bucle de cada 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); 
Cuestiones relacionadas