Индекс Android TextView отключен - PullRequest
21 голосов
/ 16 ноября 2009

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

alt text

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

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

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

Пример кода:

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

Ответы [ 9 ]

19 голосов
/ 06 октября 2011

Это решение сработало для меня.

Надстрочный текст обычно уменьшается при отображении в браузере, чего здесь не происходит, поэтому вы можете повторить это (и решить эту проблему), выполнив следующее:

someTextView.setText(Html.fromHtml("Some text<sup><small>1</small></sup>"));
17 голосов
/ 21 августа 2015

В большинстве ответов предлагается добавить отступы или использовать меньшие суб / верхние индексы. Это могут быть исправленные обходные пути, но они не решают проблему. В идеале мы хотим, чтобы Android учитывал под / верхний индекс при расчете высоты строки. Я думаю, что нашел, как это сделать, и я делюсь этим для людей, гуглящих эту проблему.

    SpannableStringBuilder sb = new SpannableStringBuilder("X2");
    sb.setSpan(new SuperscriptSpan(), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    textView.setText(sb, BufferType.SPANNABLE);

Хитрость в BufferType.SPANNABLE. Очевидно, это заставляет TextView уделять больше внимания разметке и правильно рассчитывать высоту строк.

10 голосов
/ 25 августа 2013

android: lineSpacingExtra = "4dp" должно решить это это добавит дополнительный межстрочный интервал ниже вашего текста и предотвратит сокращение индекса. Я не пробовал с верхним индексом, так что теперь это можно исправить.

10 голосов
/ 12 января 2012

Для нижнего индекса требуется небольшое изменение к вышеуказанному предложению, два небольших тега:

    textView.setText(Html.fromHtml(
        "HCO<sub><small><small>3</small></small></sub>));
6 голосов
/ 11 июля 2016

У меня была такая же проблема, поэтому после прочтения постов я обнаружил, что это работает.

Пример: 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);

Надеюсь, это поможет кому-то, кто ищет ту же проблему.

1 голос
/ 04 августа 2016

Это сработало для меня вместе с тегом Small .

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

андроид: paddingBottom = "1 dp"

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

yourTextView.setText (Html.fromHtml ("" + "Эй, 2 "));

Примечание Обратите внимание, что шаг 1 важен, в некоторых случаях мой текст все еще урезался с помощью paddingBottom. Не забудьте убрать пробелы в подпунктах и ​​небольших тегах, которые присутствуют в моем ответе :)

1 голос
/ 01 марта 2014

Я столкнулся с той же проблемой в ICS и ниже версий для Android. Я исправил проблему простым шагом

Задайте минимальную высоту для текстового представления. Это решит проблему.

Вы можете установить минимальную высоту через xml.

        android:minHeight="30dp"

или динамически

 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {

            tv.setMinHeight(52);
    }
1 голос
/ 15 октября 2011

Я отображаю дроби и смешанные числа, поэтому я использую и супер, и подписку вместе. 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());
0 голосов
/ 05 августа 2014

Чем больше тегов , тем меньше будет индекс, и вы сможете увидеть его без отсечения.

Например: H 2 O

Html.fromHtml("H<sub><small><small><small>2</small></small></small></sub>O");
...