Подтвердить что ты не робот

Подстрочный индекс Android TextView

Android TextView отсекает мои текстовые подписки (см. Изображение ниже), даже когда я использую android:layout_height="wrap_content" для TextView. Есть ли исправление/обходной путь для этого?

alt text

P/S: верхние индексы работают нормально

Примечание: заполнение не работает.

  • Я попытался даже добавить отступ 50dip, но это не помогло.
  • Я могу использовать абсолютную высоту, например, 50dip, но это все портит, когда мне нужно обернуть текст.

Образец кода:

mtTextView.setText(Html.fromHtml("HC0<sub>3</sub>"));

4b9b3361

Ответ 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

Это работало для меня вместе с тегом Маленький.

  • Внутри TextView добавить

Android: paddingBottom = "1 dp"

  1. Используйте небольшой тег после индекса

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");