2011-07-22 26 views
60

wydaje się, że nie odpowiada na to pytanie lub nie mogę go rozwiązać.Niespójność przy ustawianiu rozmiaru czcionki TextView w kodzie i zasobach

element (Nevermind AlertDialog, dzieje się w dowolnym, jak również TextView)

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 go:

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

Wynik: rozmiar czcionki nie jest taka sama, a wydaje się dużo większy przy pobieraniu z zasobu. Prawdopodobnie czegoś brakuje, więc jaki jest mój błąd i najważniejsze: dlaczego?

- UPDATE DO pierwsza odpowiedź -

Stały numer był tylko przykład, jak nikt nie będzie trudno kod ustalone rozmiary czcionek w kodzie. Więc pozwól mi przeformułować pytanie:

Dlaczego, jeśli otrzymam zasób z kodu, rozmiar tekstu jest większy niż gdy otrzymam zasób z układu XML? Poza tym pytanie pozostaje takie samo: jak mogę 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ć sp jednostek z zasobów w kodzie dla rozmiaru tekstu.

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

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

Zobacz text_size_small tam? Dlaczego w tym przypadku rozmiar czcionki jest mniejszy niż w kodzie, używając tego samego zasobu dimen?

+0

Dziękuję za podniesienie tej kwestii. Dostaję to również w moim projekcie. – anticafe

Odpowiedz

102

Należy użyć setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); ponieważ dokumentacja metody getDimension stwierdza, że ​​zwróci Resource dimension value multiplied by the appropriate metric. co rozumiem być obliczane wstępnie px wartości bezwzględnej.

To, użyj:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_size_small)); 
+0

Dziękuję. Sądzę, że to właśnie próbował powiedzieć Nikola (teraz, kiedy to widzę), ale twoje wyjaśnienie pozwoliło mi zrozumieć przyczynę problemu. – davidcesarino

2

Jego sprawą sppxdpi

tv.setTextSize(14) = 14 pixels 
+0

To był tylko przykład ... Nie użyję oznaczonych jednostek w kodzie. Zaktualizowałem moje pytanie, aby wyjaśnić. Problem polega na tym, że uzyskuję niekonsekwentne rozmiary czcionek z tego samego zasobu, w zależności od tego, czy pobierałem układ czy kod. To problem, który próbowałem rozwiązać. – davidcesarino

22

Jakoś wydaje się pasować:

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)); 
+1

Dzięki za kod demonstrujący bardzo wizualnie rozwiązanie. Ogólnie rzecz biorąc, to jest to, co maxmc powiedział ... używając 'setTextSize' z jednostkami pikselowymi podczas pobierania z zasobów. – davidcesarino

+0

Posiadałem niestandardową kontrolę, która miała ustawiony 'textSize' przy użyciu' sp'. Gdy otrzymasz tę wartość za pomocą 'getDimensionPixelSize', zostanie ona przekonwertowana na piksele. Następnie, gdy rozmiar tekstu jest ustawiony, domyślnie jest to 'sp' (lub trochę takich), więc rozmiar był zbyt duży. To bardzo pomogło. – JeffRegan