Niespójność przy ustawianiu rozmiaru czcionki TextView w kodzie i zasobach

Oficjalna dokumentacja wydaje się nie odpowiadać na to, albo nie mogę tego rozgryźć.

Element (nevermind the AlertDialog, dzieje się to również w dowolnym widoku tekstu):

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

Niespójność. Przypadek A:

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

Przypadek B:

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

Gdzie values/dimens.xml mA:

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

Wynik: rozmiar czcionki nie jest taki sam i wydaje się znacznie większy podczas pobierania z zasobu. Pewnie coś mi umyka, więc jaki jest mój błąd i najważniejsze: dlaczego?

-- UPDATE TO FIRST ANSWER --

Stała liczba była tylko przykładem, ponieważ nikt nie zakodował stałych rozmiarów czcionek w kodzie. Więc pozwól, że przeformułuję pytanie:

Dlaczego jeśli otrzymuję zasób z kodu, rozmiar tekstu jest większy niż gdy otrzymuję zasób z układu XML? poza tym, pytanie jest nadal to samo: jak odzyskać jednostkę 14sp w kodzie i zachować ją spójną z jednostką 14sp, która jest ustawiona w układzie XML? Nie zaakceptowałem odpowiedzi, ponieważ nie mówi mi, jak używać jednostek sp z zasobów w kodzie dla rozmiaru tekstu.

W tym układzie rozmiar czcionki jest inny, nawet jeśli wymiar jest taki sam:

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

Style.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>

Widzisz tam text_size_small? Dlaczego w tym przypadku rozmiar czcionki jest mniejszy niż w kodzie, używając tego samego źródła dimen?

Author: Jonathan Leffler, 2011-07-22

3 answers

Powinieneś użyć setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); ponieważ dokumentacja metody getDimension stwierdza, że zwraca Resource dimension value multiplied by the appropriate metric., co rozumiem jako wstępnie obliczoną bezwzględną wartość px.

Czyli użyj:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_size_small));
 102
Author: maxmc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-12 13:27:47

Jakoś to pasuje:

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));
 22
Author: DaRolla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-07 22:53:12

Its a matter of sp px dpi

tv.setTextSize(14) = 14 pixels 
 2
Author: Nikola Despotoski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-22 00:18:19