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
?
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));
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));
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
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