Subíndice de Android TextView siendo recortado
subscript (9)
Cuanto más número de etiquetas <small> </small> haya, más pequeño será el subíndice y podrás verlo sin recortarlo.
Ej .: H 2 O
Html.fromHtml("H<sub><small><small><small>2</small></small></small></sub>O");
Android TextView recorta mis subíndices de texto (vea la imagen a continuación) incluso cuando uso android:layout_height="wrap_content"
para TextView. ¿Hay una solución / work-around para esto?
texto alt http://i38.tinypic.com/qy8n7m.png
P / S: Los superíndices funcionan bien
Nota: el relleno no funciona.
- Intenté incluso agregar un relleno de 50dip pero no sirvió de nada.
- Puedo usar una altura absoluta como 50dip pero eso desordena todo cuando necesito texto para envolver.
Código de muestra:
mtTextView.setText(Html.fromHtml("HC0<sub>3</sub>"));
Esto funcionó para mí junto con la etiqueta pequeña .
- Dentro del complemento TextView
Android: paddingBottom = "1dp"
- Usa la etiqueta pequeña después del subíndice
yourTextView.setText (Html.fromHtml ("" + "Hey <sub> <small> 2 </ small> </ sub>"));
Nota Tenga en cuenta que el paso 1 es importante. Mi texto aún se estaba reduciendo en algún caso, y el uso de paddingBottom lo resolvió. No olvide eliminar los espacios en las etiquetas secundarias y pequeñas que están presentes en mi respuesta :)
Estoy mostrando fracciones y números mixtos, así que estoy usando tanto super como subíndices. El Html.fromHtml no funcionó para mí, ya sea que recortó la parte superior o inferior.
Curiosamente, los números mixtos funcionaron correctamente, pero las fracciones por sí mismas no lo hicieron.
Terminé usando un SpannableString con un SubscriptSpan o un SuperscriptSpan, luego configurando el tamaño de fuente en un TextAppearanceSpan.
Una vez que lo hice, tuve que expandir la altura del TextView también.
TextView number = (TextView)findViewById(R.id.number);
String temp = "1 1/2";
SpannableString s = new SpannableString(temp);
// if the string has a fraction in it, superscript the numerator and subscript the denominator
if (temp.indexOf(''/'') != -1)
{
int len = temp.length();
s.setSpan(new SuperscriptSpan(), len - 3, len - 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new TextAppearanceSpan(null, 0, fractionFontSize, null, null), len - 3, len - 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new TextAppearanceSpan(null, 0, fractionFontSize, null, null), len - 2, len - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new SubscriptSpan(), len - 1, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(new TextAppearanceSpan(null, 0, fractionFontSize, null, null), len - 1, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
number.setText(s);
Luego tuve que expandir la altura:
RelativeLayout.LayoutParams parms = (RelativeLayout.LayoutParams)number.getLayoutParams();
Rect frame = CalcSize(number.getTextSize(), quantityMaxString);
parms.height = frame.height() + fractionAdjustment;
number.setLayoutParams(parms);
CalcSize devuelve un rectángulo delimitador de la cadena más grande en la matriz de elementos de visualización.
fractionAdjustment es un valor seleccionado empíricamente que funciona para el tamaño de fuente seleccionado ajustado para la geometría de la pantalla.
Nota: este TextView está dentro de un ListView, por lo que también podría tener algún impacto.
// calculate the field dimensions, given the font size and longest string
private static Rect CalcSize(float fontSize, String maxString)
{
Rect bounds = new Rect();
paint.setTypeface(Typeface.DEFAULT);
paint.setTextSize(fontSize);
paint.getTextBounds(maxString, 0, maxString.length(), bounds);
return bounds;
}
Valores empíricos:
fractionAdjustment = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, resources.getDisplayMetrics());
fractionFontSize = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 11, resources.getDisplayMetrics());
He enfrentado el mismo problema en ICS y en versiones de Android inferiores. Arreglé el problema con un simple paso.
Dar una altura mínima a la vista de texto. Se solucionará el problema.
Puede establecer la altura mínima a través de xml.
android:minHeight="30dp"
O dinamicamente
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
tv.setMinHeight(52);
}
La mayoría de las respuestas sugieren agregar rellenos o utilizar sub / superíndices más pequeños. Estas pueden ser soluciones provisionales, pero realmente no resuelven el problema. Idealmente, queremos que Android tenga en cuenta el subíndice o superíndice al calcular la altura de la línea. Creo que encontré cómo hacerlo, y lo estoy compartiendo para las personas que buscan este problema en Google.
SpannableStringBuilder sb = new SpannableStringBuilder("X2");
sb.setSpan(new SuperscriptSpan(), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(sb, BufferType.SPANNABLE);
El truco está en BufferType.SPANNABLE. Al parecer, hace que TextView preste más atención al marcado y calcule las alturas de línea correctamente.
Para el subíndice se necesita una ligera variación de la sugerencia anterior, dos etiquetas pequeñas:
textView.setText(Html.fromHtml(
"HCO<sub><small><small>3</small></small></sub>));
Tuve el mismo problema, así que después de leer las publicaciones, encontré que esto estaba funcionando.
Ejemplo: H 2 O
simplemente use:
textView.setText(Html.fromHtml("H<sub>2</sub>O"),BufferType.SPANNABLE);
BufferType.SPANNABLE es importante ya que le pedirá a textview que considere el intervalo superíndice.
Si está utilizando un controlador de etiquetas personalizado para HTML, también puede usarlo así:
textView.setText(Html.fromHtml(data, null, new CustomHtmlTagHandler(),BufferType.SPANNABLE);
Espero que ayude a alguien que busca el mismo problema.
android: lineSpacingExtra = "4dp" debería resolverlo. Esto agregará un espacio de línea adicional debajo del texto y evitará que el subíndice se corte. No lo he probado con superíndice, así que ahora podría arreglar eso.
Esta solución funcionó para mí.
El texto con superíndice generalmente se hace más pequeño cuando el navegador lo presenta, lo que no parece ocurrir aquí, por lo que puede replicarlo (y resolver este problema) haciendo esto:
someTextView.setText(Html.fromHtml("Some text<sup><small>1</small></sup>"));