android layout textview layout-inflater

Android: la última línea de textview cortó



layout layout-inflater (17)

Tengo un LinearLayout horizontal que contiene un TextView seguido de un Spinner lado. Este LinearLayout se infla dinámicamente varias veces en un LinearLayout vertical LinearLayout contenido dentro de un RelativeLayout .

El problema es que desde que Theme.light de Theme.light a Theme.holo.light , la última línea de TextView se reduce a la mitad. Esto sucede cuando el texto dinámico es largo y abarca más de una fila.

Pude solucionar esto agregando relleno de fondo al LinearLayout horizontal que contiene TextView y Spinner .

Esto no se siente como una solución, sino más como un truco. ¿Puede alguien darme algún consejo sobre cómo corregir esto correctamente?

También he leído algunas otras preguntas, pero ninguna parece ayudar.

Diseño lineal horizontal:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/textView1" android:layout_width="150dp" android:layout_height="wrap_content" android:layout_marginRight="20dp" android:text="TextView"/> <Spinner android:id="@+id/spinner1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>

Diseño relativo donde el diseño anterior está inflado dinámicamente en Layout lineal con id ll2_7:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ScrollView android:id="@+id/scrollView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_above="@+id/relLayoutButtonNext" android:layout_below="@id/textView1" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="20dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="10dp" > <TextView android:id="@+id/textView10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="30dp" android:text="2.7" /> <TextView android:id="@+id/textView11" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_toRightOf="@id/textView10" android:text="@string/question2_7" /> <LinearLayout android:id="@+id/ll2_7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView11" android:layout_below="@+id/textView11" android:orientation="vertical" android:layout_marginBottom="20dp"> </LinearLayout> </RelativeLayout> </ScrollView> </RelativeLayout>

EDITAR: Aquí está el xml de diseño completo para arriba:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" style="@style/question_section_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="@string/question2_header" /> <RelativeLayout android:id="@+id/relLayoutButtonNext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@color/bottomBar" android:paddingBottom="3dp" android:paddingLeft="50dp" android:paddingRight="50dp" android:paddingTop="3dp" > <Button android:id="@+id/buttonNext" android:layout_width="180dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:onClick="nextStep" android:text="Next Section" android:textSize="20sp" /> <Button android:id="@+id/buttonPrevious" android:layout_width="180dp" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:onClick="previousStep" android:text="Previous Section" android:textSize="20sp" /> </RelativeLayout> <ScrollView android:id="@+id/scrollView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_above="@+id/relLayoutButtonNext" android:layout_below="@id/textView1" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="20dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="10dp" > <TextView android:id="@+id/textView10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="30dp" android:text="2.7" /> <TextView android:id="@+id/textView11" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_toRightOf="@id/textView10" android:text="@string/question2_7" /> <LinearLayout android:id="@+id/ll2_7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView11" android:layout_below="@+id/textView11" android:orientation="vertical" android:layout_marginBottom="20dp"> </LinearLayout> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView10" android:layout_below="@+id/ll2_7" android:text="2.8" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ll2_7" android:layout_toRightOf="@+id/textView10" android:text="@string/question2_8" android:layout_marginBottom="10dp"/> <LinearLayout android:id="@+id/ll2_8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView3" android:layout_below="@+id/textView3" android:layout_marginBottom="20dp" android:orientation="vertical" > </LinearLayout> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView2" android:layout_below="@+id/ll2_8" android:text="2.9" /> <TextView android:id="@+id/textView5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ll2_8" android:layout_toRightOf="@+id/textView10" android:text="@string/question2_9" android:layout_marginBottom="10dp"/> <LinearLayout android:id="@+id/ll2_9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView5" android:layout_toRightOf="@+id/textView10" android:orientation="vertical" android:layout_marginBottom="20dp"> </LinearLayout> <TextView android:id="@+id/textView6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView4" android:layout_below="@+id/ll2_9" android:text="2.10" /> <TextView android:id="@+id/textView7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ll2_9" android:layout_toRightOf="@+id/textView10" android:text="@string/question2_10" android:layout_marginBottom="10dp"/> <LinearLayout android:id="@+id/ll2_10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView7" android:layout_marginBottom="20dp" android:layout_toRightOf="@+id/textView10" android:orientation="vertical" > </LinearLayout> <TextView android:id="@+id/textView8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView6" android:layout_below="@+id/ll2_10" android:text="2.11" /> <TextView android:id="@+id/textView9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ll2_10" android:layout_toRightOf="@+id/textView10" android:text="@string/quesiton2_11" android:layout_marginBottom="10dp"/> <LinearLayout android:id="@+id/ll2_11" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView9" android:layout_below="@+id/textView9" android:orientation="vertical" android:layout_marginBottom="20dp"> </LinearLayout> <TextView android:id="@+id/textView12" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView8" android:layout_below="@+id/ll2_11" android:text="2.11.1" /> <TextView android:id="@+id/textView13" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ll2_11" android:layout_toRightOf="@+id/textView10" android:text="@string/question2_11_1" android:layout_marginBottom="10dp"/> <LinearLayout android:id="@+id/ll2_11_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView13" android:layout_toRightOf="@+id/textView10" android:orientation="vertical" android:layout_marginBottom="20dp"> </LinearLayout> </RelativeLayout> </ScrollView> </RelativeLayout>


¡Finalmente lo arreglé!

Intento agregar String a TextView en el Servicio y luego llamar a scrollTo (), ¡se cortará la última línea!

El scrollTo () debería llamarse en "Runnable", como:

private ScrollView mScrollView; public void scrollToBottom() { mScrollView = (ScrollView) findViewById(R.id.debug_textview_scrollview); mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } }); }

Lo creo porque en el momento de llamar a scrollTo () en servicio, la actualización de TextView no está lista.


Agregué un espacio ficticio después del texto agregando

textView.setText(firstString+"/n");

Intenté todas las demás soluciones. Pero esta fue la única solución que funcionó para mí


Coloque la vista de texto problemática dentro de un framelayout. Creo que la vista de texto no se calculó correctamente debido a la vista de hermanos, Spinner.

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <FrameLayout android:layout_width="150dp" android:layout_height="wrap_content"> <TextView android:id="@+id/textView1" android:layout_width="150dp" android:layout_height="wrap_content" android:layout_marginRight="20dp" android:text="TextView"/> </FrameLayout> <Spinner android:id="@+id/spinner1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>


Creo que hay muy poco que puede hacer para que esto funcione alterando los diseños. Como he descubierto, algunos métodos funcionan solo en algunos casos. Creo que depende de la jerarquía de diseño completa y no es una solución única para todos. También noté que sucede especialmente cuando tienes una fuente diferente que deseas establecer en TextView.

Un método de disparo seguro que he experimentado y probado es que puede establecer los atributos de fuente en código una vez que la vista está inflada. Supongo que tiene una fuente en la carpeta assets / fonts que quiere.

Por ejemplo, en un Fragmento:

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_view, container, false); TextView tv = (TextView)view.findViewById(R.id.text_view); tv.setText("Insert text that needs to be displayed"); AssetManager assetManager = getContext().getAssets(); Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf"); tv.setTypeface(typeFace , 0); // 0 is normal font tv.setPadding(10, 0, 10, 0); // This is not mandatory }

Y en una actividad:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(Resource.Layout.main_activity); TextView tv = (TextView)this.findViewById(R.id.text_view); tv.setText("Insert text that needs to be displayed"); AssetManager assetManager = getContext().getAssets(); Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf"); tv.setTypeface(typeFace , 0); // 0 is normal font tv.setPadding(10, 0, 10, 0); // This is not mandatory }


Cuando esto ocurre, debe asegurarse de que TextView no crezca más de lo que es contenedor:

Si un TextView se establece en wrap_content y su contenedor (o un contenedor antecesor) no deja espacio para que TextView crezca, puede ocluirse.

Si ese no es el caso, también es posible que onMeasure() de TextView veces no mida correctamente las colas de las letras, los caracteres no latinos o los efectos del texto en cursiva. Puede corregir esto configurando un estilo global para su TextView modo que se TextView sin necesidad de cambiar toda la base de códigos:

Asegúrese de que su aplicación / actividades use un tema personalizado como ese:

<style name="Custom" parent="@android:style/Theme.Light"> <item name="android:textViewStyle">@style/Custom.Widget.TextView</item> </style> <style name="Custom.Widget.TextView" parent="@android:style/Widget.TextView"> <item name="android:gravity">fill</item> <item name="android:padding">1sp</item> </style>

La respuesta de @Rynadt fue realmente útil para llegar a la etapa anterior. Establecer la gravedad del texto dentro de la vista asegura que en algunos dispositivos la oclusión nunca se lleva a cabo (el texto se ajusta correctamente dentro de la vista); en otros, una mano amiga con relleno de un valor sp se asegura de que las colas y demás se tengan en cuenta con un valor específico de TextSize.


Después de probar un millón de cosas diferentes, creo que tengo la respuesta.

LayoutGravity un LayoutGravity al elemento TextView:

android:layout_gravity="fill"

Parece resolver todos los problemas de recorte que tuve. Espero que esto ayude a alguien con el mismo problema.


Encontré una solución diferente al extender TextView y agregar una Clase personalizada como esta:

public class AdaptingTextView extends TextView { public AdaptingTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public AdaptingTextView(Context context, AttributeSet attrs) { super(context, attrs); } public AdaptingTextView(Context context) { super(context); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // set fitting lines to prevent cut text int fittingLines = h / this.getLineHeight(); if (fittingLines > 0) { this.setLines(fittingLines); } } }


La mejor solución para esto es agregar una vista ficticia de la altura deseada (es decir, esto agregará relleno) en la parte inferior de su vista.

<TableRow android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" > <View android:layout_width="match_parent" android:layout_height="30dp"/> </TableRow>

Como en mi caso, agregué una fila de tabla más en la parte inferior de la vista. Espero que esto pueda ayudar a alguien.


Me he encontrado con el mismo problema de corte que se muestra en la captura de pantalla. Es causado por la alineación de la línea base en LinearLayout horizontal. TextView y Spinner tienen líneas de base diferentes debido a la diferencia de tamaño de fuente. Para solucionar el problema, es necesario desactivar la alineación de línea base para el diseño mediante la configuración:

android:baselineAligned="false"

o en el código:

layout.setBaselineAligned(false);


Mi solución fue cercana a la aceptada, pero tuve que cambiarla a

android:layout_gravity="fill_vertical"

en lugar. De lo contrario, las otras filas se habrían estirado también con saltos de línea adicionales en lugares aleatorios. Por ejemplo, la fila más grande tenía 4 líneas, por lo que se cambió otra fila de

this is a testphrase

a

thi s is a testph rase


Puede usar un oyente de diseño global para un TextView en cualquier tipo de ViewGroup.

final TextView dSTextView = (TextView)findViewById(R.id.annoyingTextView); dSTextView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { dSTextView.getViewTreeObserver().removeOnGlobalLayoutListener(this); float lineHeight = dSTextView.getLineHeight(); int maxLines = (int) (dSTextView.getHeight() / lineHeight); if (dSTextView.getLineCount() != maxLines) { dSTextView.setLines(maxLines); } } });

Puedes leer más sobre esto here


Sé que es muy tarde, pero esto funciona como un encanto para mí. agregue este código a su textview

android:ellipsize="marquee" android:layout_weight="1"


Si tiene este problema y su TextView está dentro de RelativeLayout , intente cambiar el RelativeLayout por un LinearLayout .

Eso solucionó el problema para mí


Tengo el mismo problema, y ​​es muy molesto.

Solo sucede con el texto en árabe.

Si convierte la etiqueta en varias líneas y agrega una /n al final de la cadena, la arreglaría, pero el problema es que habría una gran brecha entre esta etiqueta y el objeto debajo de ella, debido al hecho de que este campo ahora tiene una nueva línea vacía debajo de él.

Se puede hacer un control personalizado para evitarlo. Pero en general, este es un error molesto.


Tuve el mismo problema, y ​​encontré que simplemente agregando

android:includeFontPadding="false"

la línea final de texto ya no tenía recortados sus descensores.


prueba con la eliminación de android: paddingBottom = "20dp"

de

<RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="20dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="10dp" >


getViewTreeObserver().addOnGlobalLayoutListener no funciona en una vista de reciclador. Si está utilizando un reciclador, use View.addOnLayoutChangeListener :

Descubrí que la elipsis que definí para textView en xml no siempre se reflejaba, por lo que la programé programáticamente antes de reasignar la propiedad del texto. Esto funcionó para mí.

textView.addOnLayoutChangeListener(new OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { textView.removeOnLayoutChangeListener(this); float lineHeight = textView.getLineHeight(); int maxLines = (int) (textView.getHeight() / lineHeight); if (textView.getLineCount() != maxLines) { textView.setLines(maxLines); textView.setEllipsize(TextUtils.TruncateAt.END); // Re-assign text to ensure ellipsize is performed correctly. textView.setText(model.getText()); } } });