Курсив TextView с wrap_contents, кажется, обрезает текст по правому краю

<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. Я попытался добавить поля слева и справа, но он все еще продолжал обрезаться. В конце концов мой обходной путь заключался в том, чтобы добавить по одному пробелу с обеих сторон текста. Любые другие решения?


person Grego    schedule 04.12.2010    source источник
comment
Можете ли вы опубликовать изображение того, что вы видите?   -  person user432209    schedule 04.12.2010
comment
img576.imageshack.us/img576/2865/textclip.png см. крайний правый 'о'   -  person Grego    schedule 06.12.2010
comment
Вы упомянули поля, вы имели в виду заполнение?   -  person Andrew White    schedule 06.12.2010
comment
Меня тоже эта проблема мучает   -  person Daniel    schedule 08.06.2012


Ответы (14)


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

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

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

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

person danfelabs    schedule 19.01.2011
comment
Это невероятно... Почему, мистер Андроид? Скажи мне, что это ошибка, и она будет исправлена. - person Jack'; 21.05.2020

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

person Sam    schedule 03.03.2012

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

person Xtera    schedule 14.04.2011
comment
Это единственный обходной путь, который надежно работает. Если вы используете строки ресурсов, завершающий пробел будет удален (почему он это делает?), так что это не имеет никакого эффекта, но косая черта позаботится об этом. - person Reuben Scratton; 03.08.2011
comment
Я не думаю, что это escape-символ для XML, по крайней мере, я не видел его здесь: en. wikipedia.org/wiki/ Но это определенно сработало для меня! Интересно, почему. - person nmr; 30.08.2011

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

person Oleg Vaskevich    schedule 04.01.2013
comment
Была такая же проблема с использованием setTextSkewX (это еще один способ выделить текст курсивом). Это также устранило эту проблему. - person thecoolmacdude; 14.08.2014

Нашел другое решение (проверено на 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());
}
person kamil zych    schedule 10.10.2013

Вы можете добавить HAIR SPACE к вашей строке

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

String hairSpace = getContext().getString(R.string.hair_space);
textView.setText(hairSpace + originalString + hairSpace)
person Frank Nguyen    schedule 02.06.2016
comment
это хорошо работает, спасибо! Я ненавижу эти хаки, которые Google заставляет нас делать! - person Someone Somewhere; 07.08.2016

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

person Tenacious    schedule 15.02.2012
comment
Теперь его можно убрать, установив в XML настоящий курсивный шрифт. Спасибо за подсказку. Проверьте мой ответ. - person sziraqui; 04.01.2019

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

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

Например:

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

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

person Che Jami    schedule 17.07.2013
comment
Отредактировано: Убрать провалы - person Che Jami; 18.08.2014

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

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

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

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

Работает без взлома!

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

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

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.

person sziraqui    schedule 04.01.2019
comment
Лучшие решения - person WOLVERINE; 23.07.2019

Это мое решение: форматировать текстовое представление и измерять. После этого установите ширину 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));

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

person lee    schedule 06.04.2015
comment
Это правильное решение вместо взлома - person sziraqui; 04.01.2019

У меня также была такая же проблема, и я использовал неразрывный космический объект через HTML:

textView.setText("Magnifico" + Html.fromHtml("&nbsp;");
person Oush    schedule 20.07.2018
comment
fromHtml(String) устарел в API 24 - person sziraqui; 04.01.2019

Мне кажется, что если вы применяете курсив программно, он правильно делает перенос содержимого. Поэтому установите шрифт TextView вручную, например. в котлине:

textView.typeface = Typeface.create(Typeface.DEFAULT, Typeface.ITALIC)
person kalnar    schedule 14.11.2019

Хотя обычно я предпочитаю ответ sziraqui, который предлагает использовать настоящий курсивный шрифт, они не всегда доступны.
Поскольку проблема вызвана неправильным измерением границ текста, я просто установил android:layout_width="0dp", предоставив TextView столько горизонтального пространства, сколько ему нужно. Это также может быть не идеальным во всех обстоятельствах, но это простое и не слишком хакерское решение для многих ситуаций.

person Rautermann    schedule 27.12.2020

Добавьте отступ 3dp справа от вашего TextView. Я пробовал с 1dp и 2dp, но 3dp, похоже, полностью справился с задачей.

android:paddingRight="3dp"

person user750023    schedule 17.05.2011
comment
Заполнение, похоже, не влияет на прямоугольник текстового клипа, по крайней мере, не на 2.3. - person Reuben Scratton; 03.08.2011
comment
То же самое и с заголовком приложения (в моем случае ActionBarSherlock), что не упрощает настройку заголовка TextView. Но спасибо за попытку. - person Tobias Reich; 07.01.2013