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?


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.


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


¡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.


¡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


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


7

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


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.


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.


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.


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.


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.


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"


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.


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"

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.


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"/>

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


-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>

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.