2010-02-04 25 views
69

¿Alguien puede decirme qué está yendo mal con el texto? El texto más largo que una línea no se ajusta a la línea siguiente, sino que va más allá de la pantalla.Android TextView El texto no se ajusta

A continuación se presenta el código:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:padding="4dip"> 

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

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal" 
      android:padding="4dip"> 
      <TextView 
       android:id="@+id/reviewItemEntityName" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="event/venue" 
       android:textColor="@color/maroon" 
       android:singleLine="true" 
       android:ellipsize="end" 
       android:textSize="14sp" 
       android:textStyle="bold" 
       android:layout_weight="1" /> 

      <ImageView 
       android:id="@+id/reviewItemStarRating" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentTop="true" 
       android:layout_alignParentBottom="true" 
       android:src="@drawable/title_1_star" /> 
     </LinearLayout> 

     <TextView 
      android:id="@+id/reviewItemDescription" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Description comes here" 
      android:textSize="12sp" 
      android:layout_weight="1"/> 
    </LinearLayout> 
</LinearLayout> 
+12

Nota: sólo se necesita tener los 'xmlns: android = "http://schemas.android.com/apk/res/android" 'en el elemento raíz. –

Respuesta

71

lo arreglé yo mismo, la clave es android:width="0dip"

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="4dip" 
    android:layout_weight="1"> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:padding="4dip"> 

     <TextView 
      android:id="@+id/reviewItemEntityName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="@color/maroon" 
      android:singleLine="true" 
      android:ellipsize="end" 
      android:textSize="14sp" 
      android:textStyle="bold" 
      android:layout_weight="1" /> 

     <ImageView 
      android:id="@+id/reviewItemStarRating" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentBottom="true" /> 
     </LinearLayout> 

     <TextView 
      android:id="@+id/reviewItemDescription" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:textSize="12sp" 
      android:width="0dip" /> 

    </LinearLayout> 

    <ImageView 
     android:id="@+id/widget01" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/arrow_nxt" 
     android:layout_gravity="center_vertical" 
     android:paddingRight="5dip" /> 

</LinearLayout> 

+29

mejor uso 'android: layout_weight = 1' en lugar de ancho cero, significa que textview completará el contenido restante –

+0

android: layout_weight =" 1 "no funciona en mi S3, pero android: width =" 0dip "no? Esto es extraño. Alguna explicacion? – slashburn

+0

si usa GridLayout, querrá usar columnWeight y solo está disponible para v21 o posterior. –

0

usted tiene que utilizar android:singleLine="false" en ur TextView etiquetas.

+0

por defecto es falso –

5

Uno de los parámetros de diseño es incorrecto en su código. En la primera TextView

android:layout_width="wrap_content" 

cambio a

android:layout_width="fill_parent" 

El texto que de tamaño ancho de la pantalla envolverá a la siguiente línea y establecer android:singleline="false".

+4

Creo que 'fill_parent' ha sido desaprobado y reemplazado por' match_parent'. – RCB

0

Creo que depende de la combinación particular de diseños en su pantalla. Algunos indicadores pueden ser anulados o ignorados. Tengo un TabHost con pestañas, cada pestaña es una lista de tablas. Por lo tanto, es una pestaña de ListView, cada fila es una TableLayout de TextView. Intenté las correcciones enumeradas anteriormente y ninguna de ellas funcionó.

17

Debe utilizar 2 parámetros:

  • android:ellipsize="none": el texto no se corta por la anchura TextView

  • android:scrollHorizontally="false" el texto se ajusta en tantas líneas como sea necesario

+1

Encontré en mi caso que tuve que agregar android: maxLines = "X" junto con estos dos. X es cualquier número (más de 1 obviamente) El texto envuelto en Android 2.3 – Guykun

2

Conjunto el alto de la vista de texto android:minHeight="some pixes" o android:width="some pixels". Solucionará el problema.

9

No pude obtener ninguna de estas soluciones funcionando cuando uso un TableLayout>TableRow>TextView. Luego encontré TableLayout.shrinkColumns="*". La única otra solución que funcionaba era forzar el TextView a layout_width:250px, etc. pero no me gusta forzar anchos como ese.

Pruebe algo así si trabaja con tablas.

  <TableLayout 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:shrinkColumns="*"> 

Nota necesita shrinkColumns="*"

Esto es, obviamente, dentro de un <LinearLayout>. Así que algo como <LinearLayout> <TableLayout> <TableRow> <TextView>

referencias:

TableLayout

http://code.google.com/p/android/issues/detail?id=4000

la esperanza de que ayude a alguien.

-5

Para envolver el texto y colocar el texto en la siguiente línea, debemos usar el "\ n" es decir, un nuevo carácter de línea en el archivo xml de diseño y verificar el cambio en el emulador no en la pantalla de diseño.

+2

Eso es romper la línea en algún punto dado. Para envolver según el tamaño de pantalla disponible (ancho de vista), necesitamos algo más. – hcpl

39

La única respuesta correcta a esta pregunta es que es necesario establecer los padres a una anchura adecuada (en este caso FILL_PARENT, WRAP_CONTENT) y utilizar android:layout_weight=1 para el TextView que necesita ser envuelto.

SingleLine está activado de manera predeterminada, por lo que no hará ningún cambio.

A width establecido en 0px funcionará, pero no es una buena solución.

Algunos ejemplos (en un tableview esta vez), utilizando xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:orientation="vertical"> 
    <TableLayout android:layout_width="fill_parent" 
     android:layout_height="wrap_content" android:stretchColumns="*" 
     android:id="@+id/tableLayout1"> 
     <TableRow android:id="@+id/tableRow1" android:layout_width="fill_parent" 
      android:layout_height="wrap_content"> 
      <TextView android:text="test1" android:layout_width="fill_parent" 
       android:layout_height="wrap_content" android:layout_weight="0" /> 
      <TextView android:layout_weight="1" 
       android:text="test2 very long text that needs to be wrapped properly using layout_weight property and ignoring singleline since that is set by default..." 
       android:layout_width="fill_parent" android:layout_height="wrap_content" /> 
     </TableRow>  
    </TableLayout> 
</LinearLayout> 

Si desea establecer esto en código que está buscando el layout_weight como un tercer parámetro como en este ejemplo donde está establecido en 1:

row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
       LayoutParams.WRAP_CONTENT)); 
TextView label = new TextView(getApplicationContext()); 
label.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
       LayoutParams.WRAP_CONTENT, 1f)); 
2

Soy un principiante de Android (y GUI), pero tengo mucha experiencia con el software. He revisado algunos de los tutoriales, y este es mi entendimiento:

layout_width y layout_height son atributos de TextView. Son instrucciones sobre cómo debe formarse TextView, no se refieren a cómo manejar el contenido dentro de TextView.

Si usa "fill_parent", está diciendo que la vista de texto debe formarse en relación con su vista primaria, debe llenarla.

Si usa "wrap_content", significa que debe ignorar la vista primaria y dejar que el contenido de la Vista de texto defina su forma.

Creo que este es el punto confuso. "wrap_content" no le dice a TextView cómo administrar sus contenidos (para envolver las líneas), le está diciendo que debe formarse a sí mismo en relación con sus contenidos. En este caso, sin nuevos caracteres de línea, se modela a sí misma para que todo el texto esté en una sola línea (que desafortunadamente está desbordando al elemento principal).

Creo que desea que llene el elemento primario horizontalmente y que su contenido quede vertical.

1

Aunque este es un hilo viejo, me gustaría compartir mi experiencia ya que me ayudó. Mi aplicación funcionaba bien para OS 2.0 & 4.0+ pero para un teléfono HTC que ejecutaba OS 3.x el texto no estaba ajustado. Lo que funcionó para mí fue incluir estas dos etiquetas.

android:maxLines="100" 
android:scrollHorizontally="false" 

Si elimina cualquiera de los dos no funcionó solo para el dispositivo os 3.0. El parámetro "ellipsize" tiene efecto neutral. Aquí está la etiqueta textview completa debajo de

<TextView 
       android:id="@+id/cell_description" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:paddingTop="5dp" 
       android:maxLines="100" 
       android:scrollHorizontally="false" 
       android:textStyle="normal" 
       android:textSize="11sp" 
       android:textColor="@color/listcell_detail"/> 

Espero que esto ayude a alguien.

11

Es suficiente para usar en su archivo xml.

android:singleLine="false". 

Hope it will work.

¡Todo lo mejor!

3

Para mi caso eliminar el tipo de entrada funcionó, estaba usando android: inputType = "textPostalAddress" debido a que mi textview estaba pegado en una línea y no estaba envolviendo, eliminando esto solucionó el problema.

0

Puedo poner este atributo:

android:inputType="textMultiLine" 

en mi TextView y tiene ajuste de línea y el usuario puede "Enter" para una nueva línea.

============================================= ===============

Cuando se llega a este post, es posible que desee crear un gran TextView que puede mostrar varias líneas de modo también pueden necesaria estos atributos

android:layout_height="Xdp" //where X is a number depends on how big Textview you want 
android:gravity="top" //in order to make your text start from the top of your TextView. 
+7

Esto es para EditText, no TextView. – Justin

1

Aumenta la altura, es decir, android: height = "Some size", funciona bien para mí.

0

Sé que en cuestión es correcto, pero en mi caso, el problema estaba en establecer la propiedad textSize en 'dp' - Lo he cambiado a 'sp' y funciona bien.

0

He usado android:ems="23" para resolver mi problema. Simplemente reemplace 23 con el mejor valor en su caso.

<TextView 
     android:id="@+id/msg" 
     android:ems="23" 
     android:text="ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab " 
     android:textColor="@color/white" 
     android:textStyle="bold" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
0

En mi caso, con una anidación TableRow > ScrollView > TextView, he resuelto el problema mediante el establecimiento de android:layout_width a fill_parent en TableRow, y para wrap_content en ScrollView y TextView.

1

Tuve un problema similar donde mis dos TextViews horizontalmente pesados ​​no envolvían el texto. Más tarde descubrí que el problema se debía a que mi padre de viewparents tenía wrap_content en lugar de match_parent.

0

Finalmente logré agregar algunos píxeles a la altura del TextView para resolver este problema.

Primero debe obtener realmente la altura de TextView. No es sencillo porque es 0 antes de que ya esté pintado.

añadir este código a onCreate:

mReceiveInfoTextView = (TextView) findViewById(R.id.receive_info_txt); 
if (mReceiveInfoTextView != null) { 
    final ViewTreeObserver observer = mReceiveInfoTextView.getViewTreeObserver(); 
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int height = mReceiveInfoTextView.getHeight(); 
      int addHeight = getResources().getDimensionPixelSize(R.dimen.view_add_height); 
      mReceiveInfoTextView.setHeight(height + addHeight); 

      // Remove the listener if possible 
      ViewTreeObserver viewTreeObserver = mReceiveInfoTextView.getViewTreeObserver(); 
      if (viewTreeObserver.isAlive()) { 
       viewTreeObserver.removeOnGlobalLayoutListener(this); 
      } 
     } 
    }); 
} 

Es necesario añadir esta línea a dimens.xml

<dimen name="view_add_height">10dp</dimen> 

espero que ayude.

0

Acabo de eliminar android:lines="1" y he añadido android:maxLines="2", esto tiene el texto para ajustar automáticamente. El problema era el atributo android:lines. Eso hace que el ajuste de texto a no ocurra.

No tuve que usar maxEms o singleLine="false" (API obsoleta) para solucionarlo.

0

Agregué un \ n en el medio de la cadena y se veía bien.

0

Me he pasado horas para descubrir que en el texto que estaba tratando de mostrar había una sola cita (en string.xml) así que simplemente escapé con una barra invertida y funcionó muy bien =>altura de el TextView estaba envolviendo correctamente el texto:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    android:paddingTop="16dp" 
    tools:context=".MainActivity"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:fontFamily="sans-serif-smallcaps" 
     android:text="@string/instructions" 
     android:textAlignment="center" 
     android:textSize="18sp" 
     android:textStyle="bold" /> 

    <EditText 
     android:id="@+id/keyword" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/defaultKeyword" 
     android:textSize="22sp" 
     /> 
Cuestiones relacionadas