La última palabra de Android de una línea puede provocar una dimensión de texto incorrecta si se utiliza un margen derecho
Tengo un comportamiento extraño al usar el texto intrépido en un textview.
Así que el problema es el siguiente, he creado un elemento personalizado que contiene texto y se supone que se utiliza como un elemento más adelante en una lista, por lo que el elemento se contiene varias veces en una scrollviews linearlayout, que tiene orientación vertical.
- Animación del tamaño de texto de TextView
- ¿Cómo crear sugerencias en el cuadro de edición textview que desaparecen cuando textview tiene foco?
- Finalizar el problema de la elipse con TextViews
- Android: establece la vista de texto al hacer clic en el elemento
- ¿Cómo puedo cambiar la parte del color de un TextView?
El diseño del elemento es el siguiente
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" style="@style/ButtonItem"> <TextView android:id="@+id/m_oItem_TextView_TopLeft" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginLeft="20dp" android:layout_alignParentTop="true" android:layout_marginTop="10dp" android:textColor="@color/black" android:textSize="@dimen/font_size_12" /> <TextView android:id="@+id/m_oItem_TextView_TopMiddle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/m_oItem_TextView_TopLeft" android:layout_toRightOf="@+id/m_oItem_TextView_TopLeft" android:layout_toLeftOf="@+id/m_oItem_TextView_TopRight" android:layout_marginRight="20dp" android:textColor="@color/black" android:textSize="@dimen/font_size_12" android:gravity="right"/> <TextView android:id="@+id/m_oItem_TextView_TopRight" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="40dp" android:layout_alignTop="@+id/m_oItem_TextView_TopLeft" android:textColor="@color/black" android:textSize="@dimen/font_size_12"/> <TextView android:id="@+id/m_oItem_TextView_Bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/m_oItem_TextView_TopLeft" android:layout_alignRight="@+id/m_oItem_TextView_TopRight" android:layout_below="@+id/m_oItem_TextView_TopLeft" android:layout_marginTop="5dp" android:textColor="@color/black" android:textSize="@dimen/font_size_14" /> <ImageView android:id="@+id/m_oItem_PlaceHolder" android:layout_width="wrap_content" android:layout_height="10dp" android:layout_alignLeft="@+id/m_oItem_TextView_TopLeft" android:layout_alignRight="@+id/m_oItem_TextView_TopRight" android:layout_below="@+id/m_oItem_TextView_Bottom" android:contentDescription="@string/image_description"/> <ImageView android:id="@+id/m_oPart_Arrow_Image" android:scaleType="fitCenter" android:layout_width="20dp" android:layout_height="20dp" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:layout_marginRight="5dp" android:src="@drawable/arrow_right" android:contentDescription="@string/image_description"/> </RelativeLayout>
La vista de texto m_oItem_TextView_Bottom es la parte que contendrá texto que puede ser demasiado largo para él, aumentando así la altura de la vista de texto si es necesario. Como probé esto, todo estaba funcionando correctamente y la vista de texto tenía la altura necesaria.
Sin embargo una vez
android:textStyle="bold"
El texto se convertirá naturalmente más ancho, así puede necesitar más líneas. El problema ahora es que esto no será contabilizado por android de alguna manera.
Por ejemplo, si la línea no negrita apenas requiere dos líneas como (último elemento en la imagen de abajo)
El texto en negrita requerirá tres líneas, pero la vista de texto seguirá proporcionando sólo dos líneas
¿Alguna vez alguien corrió en el mismo problema o tiene una solución o al menos una sugerencia de cómo podría resolver el problema. Gracias de antemano en cualquier caso
EDIT: como se solicitó el estilo ButtonItem es este
<style name="ButtonItem"> <item name="android:background">@drawable/button_item</item> </style>
@ Drawable / button_item siendo:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/button_item_down" /> <item android:state_selected="true" android:drawable="@drawable/button_item_selected" /> <item android:drawable="@drawable/button_item_normal" /> </selector>
@ Drawable / button_item_down siendo:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:bottom="1dp" android:left="-2dp" android:right="-2dp" android:top="-2dp"> <shape android:shape="rectangle"> <solid android:color="@color/white" /> <stroke android:width="@dimen/button_item_stroke_thickness" android:color="@color/black"/> </shape> </item> </layer-list>
@ Drawable / button_item_selected siendo:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:bottom="1dp" android:left="-2dp" android:right="-2dp" android:top="-2dp"> <shape android:shape="rectangle"> <solid android:color="@color/white" /> <stroke android:width="@dimen/button_item_stroke_thickness" android:color="@color/black"/> </shape> </item> </layer-list>
@ Ser drawable / button_item_normal:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:bottom="1dp" android:left="-2dp" android:right="-2dp" android:top="-2dp"> <shape android:shape="rectangle" > <solid android:color="@color/transparent" /> <stroke android:width="@dimen/button_item_stroke_thickness" android:color="@color/black" /> </shape> </item> </layer-list>
Esencialmente están allí para crear la línea negra debajo del elemento y hacer el fondo blanco si se hace clic o se selecciona. Aunque el seleccionado en nunca se utiliza ya que el estado seleccionado nunca se establece en el código de todos modos.
También lo intenté sin el estilo como el fondo, pero como era de esperar el problema sigue siendo el mismo.
EDITAR OTRA VEZ: Bueno, así que pude rastrear el problema un poco más, el cambio de tamaño de la vista de texto es en realidad correcta. El problema concreto es si sigue. Si la última palabra de una línea (por ejemplo, "esto es una prueba" mientras que la prueba es la última palabra) provoca un salto de línea, la última palabra debe ser lo suficientemente larga de alguna manera. Yo prueba esto utilizando cadenas ficticias, con el mismo elemento utilizado en la pregunta.
Aquí hay algunas fotos
Como puede ver la línea que causa el problema necesita un carácter más, entonces la palabra es lo suficientemente larga como para encajar.
ÚLTIMO EDIT: ok encontró la respuesta (ver abajo)
- ¿Cómo evitar la vista superpuesta en el diseño relativo en android?
- Modificación del comportamiento de la línea
- Prensa larga sobre el texto seleccionado en textview en android
- Actualización de Android TextView en subprocesos y ejecución
- Cómo enlazar Android TextView a evento Click con MvvmCross
- Actualizar Textview desde la función Android
- Establecer el peso de diseño de un TextView programaticamente
- Android - Centro de vista de texto en LinearLayout
Bueno, el TextView está siendo reajustado muy bien con el texto en negrita por lo que es el RelativeLayout que necesita expandirse para ajustarse a la TextView ampliada. Es posible que tengas más suerte con LinearLayouts (Una Vertical y quizás otra Horizontal para que coincida con el diseño que creaste usando el RelativeLayout) porque son buenos para volver a clasificarse cuando sus hijos cambian.
Referencia: http://logc.at/2011/10/18/when-to-use-linearlayout-vs-relativelayout/
FINALMENTE SEGUIMO EL PROBLEMA,
Así que aquí está la solución, el problema fue el margin_Right del m_oItem_TextViewBottom que fue causado por:
android:layout_alignRight="@+id/m_oItem_TextView_TopRight"
Por lo que efectivamente creó un derecho de margen que fue el alborotador, lo probé con otras vistas de texto y márgenes de derecha y todos tenían el mismo problema.
Lo reemplazo con un acolchado del mismo margen y terminé con esto como mi solución final para el artículo.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" style="@style/ButtonItem"> <TextView android:id="@+id/m_oItem_TextView_TopLeft" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_marginLeft="20dp" android:layout_alignParentTop="true" android:layout_marginTop="10dp" android:textColor="@color/black" android:textSize="@dimen/font_size_12" /> <TextView android:id="@+id/m_oItem_TextView_TopMiddle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/m_oItem_TextView_TopLeft" android:layout_toRightOf="@+id/m_oItem_TextView_TopLeft" android:layout_toLeftOf="@+id/m_oItem_TextView_TopRight" android:layout_marginRight="20dp" android:textColor="@color/black" android:textSize="@dimen/font_size_12" android:gravity="right"/> <TextView android:id="@+id/m_oItem_TextView_TopRight" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:paddingRight="40dp" android:layout_alignTop="@+id/m_oItem_TextView_TopLeft" android:textColor="@color/black" android:textSize="@dimen/font_size_12"/> <TextView android:id="@+id/m_oItem_TextView_Bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/m_oItem_TextView_TopLeft" android:layout_below="@+id/m_oItem_TextView_TopLeft" android:layout_marginTop="5dp" android:paddingRight="40dp" android:textColor="@color/black" android:textStyle="bold" /> <ImageView android:id="@+id/m_oItem_PlaceHolder" android:layout_width="wrap_content" android:layout_height="10dp" android:layout_alignLeft="@+id/m_oItem_TextView_TopLeft" android:layout_alignRight="@+id/m_oItem_TextView_TopRight" android:layout_below="@+id/m_oItem_TextView_Bottom" android:contentDescription="@string/image_description"/> <ImageView android:id="@+id/m_oPart_Arrow_Image" android:scaleType="fitCenter" android:layout_width="20dp" android:layout_height="20dp" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:layout_marginRight="5dp" android:src="@drawable/arrow_right" android:contentDescription="@string/image_description"/> </RelativeLayout>