Курсив TextView с wrap_contents, кажется, обрезает текст по правому краю - PullRequest
51 голосов
/ 04 декабря 2010
<TextView android:id="@+id/prodLbl"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:textColor="#FFFFFF"
    android:textSize="30dip"
    android:textStyle="italic"
    android:text="Magnifico"
    />

Кажется, что отсекает несколько пикселей от самого правого символа, по крайней мере, на эмуляторе 480x800 или Nexus One.

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

Ответы [ 12 ]

21 голосов
/ 03 марта 2012

Вы также можете использовать символ Unicode без пробела (\ u00A0).

20 голосов
/ 20 января 2011

android:layout_width="wrap_content", дает вам прямоугольник для рендеринга обернутого контента. Все будет хорошо работать для обычного текста (не курсивом).

После включения текста italic обернутый текст будет пытаться вписаться в прямоугольник и, следовательно, крайний правый символ будет обрезан, если его невозможно обрезать (например, ., ), 1 и т. Д.)

Решение, как предлагается, состоит в том, чтобы в конце текста был пробел (или что-нибудь лучше ??)

PS: Это относится и к android:gravity="right", потому что текст будет сдвинут вправо. Если у нас есть italic текст, мы сталкиваемся с той же проблемой.

12 голосов
/ 14 апреля 2011

Я добавил " \" в конец всех строк в моем strings.xml.\ - символ побега, так что я мог бы решить проблему, но это решение неприятноНадеюсь, это поможет.

6 голосов
/ 05 января 2013

Просто добавьте лишний пробел в конец текста. В XML вам придется добавить \u0020 в конец, иначе XML по умолчанию игнорирует пробелы в начале / конце.

4 голосов
/ 10 октября 2013

Нашел другое решение (проверено на 4.1.2 и 4.3 при использовании wrap_content).Если вы расширяете класс TextView или EditText, вы можете переопределить метод onMeasure следующим образом:

@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    final int measuredWidth = getMeasuredWidth();
    final float tenPercentOfMeasuredWidth = measuredWidth * 0.1f;
    final int newWidth = measuredWidth + (int) tenPercentOfMeasuredWidth;

    setMeasuredDimension(newWidth, getMeasuredHeight());
}
3 голосов
/ 02 июня 2016

Вы можете добавить пространство для волос к вашей строке

<string name="hair_space">&#x200A;</string>

String hairSpace = getContext().getString(R.string.hair_space);
textView.setText(hairSpace + originalString + hairSpace)
2 голосов
/ 16 февраля 2012

Это относится и к TextViews фиксированной ширины, а не только к "wrap_content". Я не уверен, является ли проблема конкретной версией, как упоминали некоторые комментаторы. Я вижу проблему на всех версиях Honeycomb. Из того, что я видел, проблема не исчезает, если задать поля, отступы, использовать фиксированную ширину или шрифт с истинным курсивом.

1 голос
/ 06 апреля 2015

Это мое решение: форматировать текстовое представление и измерять. После этого установите ширину textview с 1 ​​пикселем, добавьте к измеренной ширине.

TextView textView = new TextView(this);
textView.setText("Text blah blah");
textView.setTypeface(typeface, Typeface.BOLD_ITALIC)
textView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
textView.setLayoutParams(new LayoutParams(textView.getMeasuredWidth() + 1, 
                                             LayoutParams.WRAP_CONTENT));

Работа для меня. Надеюсь, что это поможет.

1 голос
/ 17 июля 2013

Глядя на источник, я обнаружил, что установка тени расширяет прямоугольник клипа.

Хитрость заключается в том, чтобы установить невидимую тень сразу за символом.

Например:

android:shadowRadius="2"
android:shadowDx="2"
android:shadowColor="#00000000"

Я думаю, что это решение лучше, так как оно не увеличит ширину TextView, что может произойти при добавлении дополнительного символа (что более заметно на фоне).

0 голосов
/ 04 января 2019

Правильное и чистое решение:

Используйте нестандартный шрифт курсив вместо установки textStyle = 'italic' Например:

<android.support.v7.widget.AppCompatTextView
            android:text="yolO"
            app:fontFamily="@font/roboto_italic"/>

У меня нетпробовал это на обычном TextView, но из моих наблюдений, проблема с textStyle = 'italic'.

Работает без какого-либо взлома!

Вот доказательствообвиняющий атрибут textStyle:

Я создал собственный шрифт fontFamily и определил шрифт для обычного, полужирного и курсивного

res / font / app_font_family.xml

<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
    <font app:fontStyle="normal" app:fontWeight="400" app:font="@font/roboto_regular"/>
    <font app:fontStyle="italic" app:fontWeight="400" app:font="@font/roboto_italic" />
    <font app:fontStyle="normal" app:fontWeight="700" app:font="@font/roboto_medium"/>
</font-family>

Теперь, когда я использую это fontFamily и применяю textStyle = 'italic', крайний правый символ все еще обрезается.

<android.support.v7.widget.AppCompatTextView
            android:text="yolO"
            app:fontFamily="@font/app_font_family"
            android:textStyle='italic' />

Это на Api 23 с библиотекой поддержки 28.0.0 и Android Studio 3.2

...