Подстрочный индекс Android TextView
Android TextView отсекает мои текстовые подписки (см. Изображение ниже), даже когда я использую android:layout_height="wrap_content"
для TextView. Есть ли исправление/обходной путь для этого?
![alt text]()
P/S: верхние индексы работают нормально
Примечание: заполнение не работает.
- Я попытался даже добавить отступ 50dip, но это не помогло.
- Я могу использовать абсолютную высоту, например, 50dip, но это все портит, когда мне нужно обернуть текст.
Образец кода:
mtTextView.setText(Html.fromHtml("HC0<sub>3</sub>"));
Ответы
Ответ 1
Это решение работало для меня.
Надстрочный текст обычно делается меньше, когда браузер отображает его, что, похоже, не происходит здесь, поэтому вы можете реплицировать это (и решить эту проблему), выполнив следующее:
someTextView.setText(Html.fromHtml("Some text<sup><small>1</small></sup>"));
Ответ 2
Большинство ответов предлагают добавить paddings или использовать меньшие sub/superscripts. Это могут быть исправные обходные пути, но они действительно не решают проблему. В идеале мы хотим, чтобы Android учитывал sub/superscript при расчете высоты линии. Думаю, я нашел, как это сделать, и я поделился им с людьми, занимающимися этой проблемой.
SpannableStringBuilder sb = new SpannableStringBuilder("X2");
sb.setSpan(new SuperscriptSpan(), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(sb, BufferType.SPANNABLE);
Фокус в BufferType.SPANNABLE. По-видимому, TextView уделяет больше внимания разметке и правильно вычисляет высоту линии.
Ответ 3
Для нижнего индекса требуется небольшое изменение вышеприведенного предложения, два небольших тега:
textView.setText(Html.fromHtml(
"HCO<sub><small><small>3</small></small></sub>));
Ответ 4
android: lineSpacingExtra = "4dp" должен решить эту проблему
это добавит дополнительные интервалы между строками ниже вашего текста и не позволит индексам обрезаться. Я не пробовал его с надстрочным индексом, чтобы он мог исправить это.
Ответ 5
У меня была такая же проблема, поэтому после прочтения сообщений я нашел, что это работает.
Пример: H 2 O
просто используйте:
textView.setText(Html.fromHtml("H<sub>2</sub>O"),BufferType.SPANNABLE);
BufferType.SPANNABLE важен, так как он покажет, что textview рассмотрит верхний индекс.
Если вы используете собственный обработчик тегов для HTML, вы также можете использовать его следующим образом:
textView.setText(Html.fromHtml(data, null, new CustomHtmlTagHandler(),BufferType.SPANNABLE);
Надеюсь, что это поможет кому-то искать ту же проблему.
Ответ 6
Я показываю дроби и смешанные числа, поэтому я использую как супер, так и подписывание вместе. Html.fromHtml не работал у меня, он либо обрезал верх, либо снизу.
Как ни странно, смешанные числа работали правильно, но фракции сами по себе не делали.
В итоге я использовал SpannableString с SubscriptSpan или SuperscriptSpan, а затем установил размер шрифта в TextAppearanceSpan.
Как только я это сделал, мне пришлось также увеличить высоту TextView.
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);
Затем мне пришлось увеличить высоту:
RelativeLayout.LayoutParams parms = (RelativeLayout.LayoutParams)number.getLayoutParams();
Rect frame = CalcSize(number.getTextSize(), quantityMaxString);
parms.height = frame.height() + fractionAdjustment;
number.setLayoutParams(parms);
CalcSize возвращает ограничивающий прямоугольник самой большой строки в массиве элементов отображения.
fractionAdjustment - это эмпирически выбранное значение, которое работает для выбранного размера шрифта, скорректированного для геометрии экрана.
Примечание. Это TextView находится внутри ListView, так что это может также повлиять.
// 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;
}
Эмпирические значения:
fractionAdjustment = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, resources.getDisplayMetrics());
fractionFontSize = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 11, resources.getDisplayMetrics());
Ответ 7
Я столкнулся с той же проблемой в ICS и ниже версий Android. Я исправил проблему простым шагом
Дайте минимальную высоту текстовому виду. Это устранит проблему.
Вы можете установить минимальную высоту через xml.
android:minHeight="30dp"
Или динамически
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
tv.setMinHeight(52);
}
Ответ 8
Это работало для меня вместе с тегом Маленький.
Android: paddingBottom = "1 dp"
- Используйте небольшой тег после индекса
yourTextView.setText(Html.fromHtml( "+" Hey <sub> <small> 2 </small> </sub> "));
Примечание Обратите внимание, что шаг 1 важен, в некоторых случаях мой текст все еще сокращается, используя paddingBottom разрешил его.
Не забудьте удалить пробелы в суб и малые теги, которые присутствуют в моем ответе:)
Ответ 9
Больше числа <small> </малый > теги там, тем меньше будет индекс, и вы сможете увидеть его, не будучи обрезанным.
Например: H 2 O
Html.fromHtml("H<sub><small><small><small>2</small></small></small></sub>O");