Несоответствие при настройке размера шрифта TextView в коде и ресурсах - PullRequest
62 голосов
/ 22 июля 2011

Официальная документация , похоже, не отвечает этому, или я не могу понять это. Элемент

(не говоря уже о AlertDialog, это также происходит в любом TextView):

TextView tv = (TextView) dialog.findViewById(android.R.id.message);

Несоответствие.Случай A:

tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
// or tv.setTextSize(14); does the same

Случай B:

tv.setTextSize(getResources().getDimension(R.dimen.text_size_small));
// TypedValue makes no difference either.

, где values/dimens.xml имеет его:

<dimen name="text_size_small">14sp</dimen>

Результат: размер шрифта не совпадает, ипоявляется намного больше при получении с ресурса.Я, наверное, что-то упускаю, так в чем моя ошибка, и самое главное: почему?

- ОБНОВЛЕНИЕ ПЕРВЫЙ ОТВЕТ -

Фиксированный номер был простопример, как никто не будет жестко кодировать фиксированный размер шрифта в коде.Итак, позвольте мне перефразировать вопрос:

Почему, если я получу ресурс из кода, размер текста будет больше, чем когда я получу ресурс из XML-макета? Кроме того, вопрос по-прежнемуто же самое: как мне извлечь единицу 14sp в коде и сохранить ее в соответствии с единицей 14sp, установленной в XML макета?Я не принял ответ, потому что он не говорит мне, как использовать sp-единицы из ресурса в коде для размера текста.

В этом макете размер шрифта отличается, даже если размерность одинакова:

<TextView
            android:id="@+id/my_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@style/TextBody" />

styles.xml:

<style name="TextBody">
    <item name="android:textSize">@dimen/text_size_small</item>
    <item name="android:lineSpacingMultiplier">1.1</item>
    <item name="android:textColor">@color/body_text_1</item>
    <item name="android:textIsSelectable">true</item>
    <item name="android:linksClickable">true</item>
</style>

См. Text_size_small там?Почему в этом случае размер шрифта меньше, чем в коде, используя тот же ресурс dimen?

Ответы [ 3 ]

102 голосов
/ 13 августа 2011

Вы должны использовать setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);, потому что документация метода getDimension гласит, что он возвращает Resource dimension value multiplied by the appropriate metric., который, как я понимаю, является предварительно рассчитанным абсолютным значением px.

То есть используйте:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_size_small));
24 голосов
/ 20 февраля 2012

Каким-то образом это подходит:

XML:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="typo14">9sp</dimen>
</resources>

Java:

setTextSize(TypedValue.COMPLEX_UNIT_SP, 9);
setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.typo14));
2 голосов
/ 22 июля 2011

Это вопрос sp px dpi

tv.setTextSize(14) = 14 pixels 
...