Cómo ajustar texto en la vista de texto en Android

86

¿Alguien sabe cómo ajustar texto en TextView en la plataforma Android? es decir, si el texto en la vista de texto excede la longitud de la pantalla, debe mostrarse en la segunda línea.

He buscado y probado lo siguiente:

android:scrollHorizontally="false",
android:inputType="textMultiLine",
android:singleLine="false"

Pero ninguno funciona ...

¿Alguien puede sugerir cómo puedo hacerlo?

Sameer
fuente
7
TextViews debe ajustarse a la palabra de forma predeterminada. ¿Puedes publicar todo tu diseño?
danh32
¿Por casualidad está Textview dentro de un diseño de tabla? Si es así, tengo una respuesta para ti.
JohnFx
1
En mi caso, después de agregar alrededor de media docena de atributos (descritos a continuación) para forzar a la vista de texto a ajustar el texto en varias líneas, sin éxito, noté que tenía un atributo android:inputType="textPersonName". Aparentemente, fue agregado por la herramienta de diseño de Android Studio. ¡Eliminar ese atributo solucionó el problema! Puede haber otros tipos de entrada que también impidan el ajuste.
LarsH

Respuestas:

55

Para mí, este problema solo ocurrió en Android <4.0

La combinación de parámetros que utilicé fue:

android:layout_weight="1"
android:ellipsize="none"
android:maxLines="100"
android:scrollHorizontally="false"

El recuento de maxLines parecía ser la pieza final aleatoria que hizo que mi TextView se ajustara.

Guykun
fuente
9
Sé que ahora es un hilo antiguo, pero pensé en publicar mis hallazgos. Usé solo 'android: maxLines' y luego envolvió mi texto. Cheer @Guykun
StuStirling
Nuevamente, esto equivale simplemente a establecer la altura de TextView en match_parent, que no es lo mismo que hacer que la altura de TextView se expanda para incluir las líneas adicionales.
SMBiggs
50

Diseño de restricción

<TextView
android:id="@+id/some_textview"
android:layout_width="0dp"
android:layout_height="wrap_content"

app:layout_constraintLeft_toLeftOf="@id/textview_above"
app:layout_constraintRight_toLeftOf="@id/button_to_right"/>
  • Asegúrese de que el ancho de su diseño sea cero
  • Se definen las restricciones izquierda / derecha
  • la altura del diseño de wrap_content permite la expansión hacia arriba / hacia abajo.
  • Establecer android:maxLines="2"para evitar la expansión vertical (2 es solo un ejemplo)
  • Las elipses son prob. una buena idea con líneas máximasandroid:ellipsize="end"

0dp width permite restricciones de izquierda / derecha para determinar qué tan ancho es su widget.

Establecer restricciones de izquierda / derecha establece el ancho real de su widget, dentro del cual se ajustará su texto.

Documentos de diseño de restricciones

Panadero
fuente
¡Si! ¡Así es exactamente como funciona! Solo asegúrese de establecer el ancho en 0dp
Yoraco Gonzales
establecer las restricciones de izquierda y derecha me ayudó a ajustarlo, en lugar de que el texto se desbordara más allá de los límites de la derecha
Jia Tse
31

Para el caso en el que TextViewestá dentro de a TableLayout, la solución es establecer android:shrinkColumns="1"en TableLayout. (Reemplace 1con el número de columna en el que se encuentra el TextView que desea ajustar. (Indexado 0)

AFAICT, no se necesitan otros atributos en el TextView.

Para otros casos, vea las otras respuestas aquí.

FWIW, inicialmente había conseguido que funcionara con

 <TextView
   android:id="@+id/inventory_text"
   android:layout_width="fill_parent"
   android:layout_weight="1"
   android:width="0dp"

pero eso resultó en un espacio vacío adicional en la parte inferior del diálogo en el que estaba todo.

aij
fuente
¡Esto era lo que estaba buscando! De lo contrario, mis palabras se cortan
Carson Holzheimer
12

Debes utilizar 2 parámetros:

  • android:ellipsize="none" : el texto no se corta en el ancho de la vista de texto

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

Kartaguez
fuente
5
Eso no me funciona. (FWIW, tengo un TextView en un TableRow en un TableLayout.)
aij
8

Úselo app:breakStrategy="simple"en AppCompatTextView, controlará el diseño del párrafo.

Tiene tres valores constantes

  • equilibrado
  • alta calidad
  • sencillo

Diseñando en su TextView xml

<android.support.v7.widget.AppCompatTextView
        android:id="@+id/textquestion"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:scrollHorizontally="false"
        android:text="Your Question Display Hear....Your Question Display Hear....Your Question Display Hear....Your Question Display Hear...."
        android:textColor="@android:color/black"
        android:textSize="20sp"
        android:textStyle="bold"
        app:breakStrategy="simple" />

Si su nivel de API mínimo actual es 23 o más, en Codificación

yourtextview.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);

Para obtener más referencias, consulte esta BreakStrategy

Imagen de estrategia de interrupción de vista de texto

Nirav Bhavsar
fuente
7

Esto debería solucionar el problema: android:layout_weight="1".

usuario755121
fuente
Esto solo hace que TextView se expanda para ocupar tanto espacio como sea posible, que es lo mismo que establecer la Altura en match_parent. No es exactamente lo mismo que quería OP.
SMBiggs
1
En el caso de TableLayout, layout_weight="1"solucionó el problema por mí. Sin embargo, mi TableRow que contiene TextView, se había layout_heightestablecido en un valor específico. Tal vez sea útil para alguien
kit
5

Bien, chicos, la verdad está en algún punto intermedio porque tienen que ver el problema desde la perspectiva de los padres y del niño. La siguiente solución funciona SÓLO cuando el modo spinner = dialogindependientemente de la versión de Android (no hay problema allí ... lo probé en VD y DesireS con Android => 2.2):

  1. . Configure el modo de su spinner (el padre) como:

    android:spinnerMode="dialog"  
    
  2. Establezca las propiedades de la vista de texto (vista personalizada secundaria) en:

    android:layout_weight="1"  
    android:ellipsize="none"  
    android:maxLines="100"  
    android:scrollHorizontally="false"
    

Espero que esto también funcione para ti.

skourkos
fuente
Intenté tantas cosas para que funcionara en modo 'desplegable' pero nada funcionó. Ahora establecí el modo 'diálogo'.
Mangesh
4

Al establecer android:maxEmsun valor dado junto con android:layout_weight="1"hará que TextView se ajuste una vez que alcance la longitud dada de ems.

Freddroid
fuente
También funciona para TextView colocado en RelativeLayout.
ayz4sci
he estado buscando durante horas, gracias, funciona muy bien en el
diseño de
3

En Android Studio 2.2.3 bajo la inputTypepropiedad hay una propiedad llamada textMultiLine. La selección de esta opción solucionó un problema similar para mí. Espero que eso ayude.

usuario7652193
fuente
2
Esto es para EditText, no Textview
PsychedelicSubstance
2

Estaba trabajando en un TextView dentro de un diseño dentro de un RecyclerView. Había texto queden cortadas, ex, para Read this message, vi: Read this. Intenté configurar android:maxLines="2"TextView, pero nada cambió. Sin embargo, android:lines="2"resultó en Read thisprimera línea y messageen segunda.

Stan Kurdziel
fuente
1

Yo tuve el mismo problema. El siguiente cambio lo hizo funcionar:

android:layout_width="wrap_content"

Los puntos suspensivos, maxLines o layout_weight, no hicieron ninguna diferencia. Nota: el ancho principal también se establece como wrap_content.

Medha
fuente
1

Todo lo que tiene que hacer es establecer el ancho de su vista de texto .

android: layout_width = "60dp"

puede cambiar el ancho a su elección. Simplemente escriba una oración larga para verificar si funciona así

android: text = "quiero estar entre los ingenieros de software de clase mundial"

Akindev
fuente
1

Prueba el enfoque de @ Guykun

android:layout_weight="1" android:ellipsize="none" android:maxLines="100" android:scrollHorizontally="false"

Además, asegúrese de que el ancho de los padres no esté configurado para ajustar el contenido. Esto es lo que me estaba perdiendo.

Shailendra Suriyal
fuente
0

Estoy usando Android 2.2 y mi vista de texto irá automáticamente a la siguiente línea si excede la pantalla.

Si desea que el texto vaya a la siguiente línea antes del final de la pantalla, simplemente agregue (solo ingrese su propio valor de dp). Esto será útil si tiene una imagen a la derecha del texto.

android:layout_marginRight="52dp"
Britc
fuente
0

Lo suficientemente extraño: creé mi TextView en código y se envolvió, a pesar de que no configuré nada excepto cosas estándar, pero compruébelo usted mismo:

LinearLayout.LayoutParams childParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);
childParams.setMargins(5, 5, 5, 5);

Label label = new Label(this);
label.setText("This is a testing label This is a testing label This is a testing label This is a testing labelThis is a testing label This is a testing label");
label.setLayoutParams(childParams);

Como puede ver en la definición de parámetros, estoy usando un LinearLayout. La clase Label simplemente extiende TextView, sin hacer nada allí excepto establecer el tamaño y el color de la fuente.

Al ejecutarlo en el emulador (API nivel 9), envuelve automáticamente el texto en 3 líneas.

Ready4Android
fuente
Tenga en cuenta el uso de este código LinearLayout.LayoutParams childParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);. Lo más probable es que lo hace la envoltura considera que son "automagic"
nemesisfixx
0

Simplemente establezca layout_withun tamaño definido , cuando el texto llene el ancho máximo, se desbordará a la siguiente línea causando un efecto de ajuste.

<TextView
    android:id="@+id/segmentText"
    android:layout_marginTop="10dp"
    android:layout_below="@+id/segmentHeader"
    android:text="You have the option to record in one go or segments(if you swap options 
    you will loose your current recordings)"
    android:layout_width="300dp"
    android:layout_height="wrap_content"/>
Frank Odoom
fuente
0

El truco es con el ancho de textView, intente que sea un número dedicado como:

<TextView
    android:layout_width="300dp"
    android:layout_height="wrap_content"/>

He probado muchas soluciones sin ningún resultado, lo he intentado:

    android:ellipsize="none"
    android:scrollHorizontally="false"

lo único que activó la opción de ajuste es el ancho dedicado

Ahmed Khalid Kadhim
fuente
-1

Necesita agregar su TextView en un ScrollView con algo como esto:

<ScrollView android:id="@+id/SCROLL_VIEW"  
android:layout_height="150px"   
android:layout_width="fill_parent">  

<TextView   
   android:id="@+id/TEXT_VIEW"   
   android:layout_height="wrap_content"   
   android:layout_width="wrap_content"   
   android:text="This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header" />  
 </ScrollView>
Ludovic Landry
fuente
4
Gracias por su respuesta Pero mi objetivo es envolver el texto cuando exceda la longitud de la línea para no poner un desplazador horizontal.
Sameer