Uzyskaj wymiar z XML i ustaw rozmiar tekstu w czasie wykonywania

101

W dimens.xml mam:

<dimen name="text_medium">18sp</dimen>

W czasie wykonywania otrzymuję tę wartość i ustawiam rozmiar tekstu widoku tekstu:

int size = context.getResources().getDimensionPixelSize(R.dimen.text_medium);
textView.setTextSize(size).

Na tablecie 10 ″ (1280 x 800) wszystko jest w porządku; ale na telefonie (800 x 480) widok tekstu ma bardzo dużą czcionkę. Na tablecie rozmiar wynosi 18; przez telefon jest 27.

Jeśli ustawię rozmiar ręcznie przez:

textView.setTextSize(size)

rozmiar jest normalny na obu urządzeniach.

Yura Shinkarev
źródło

Odpowiedzi:

298
<dimen name="text_medium">18sp</dimen>

Ustaw rozmiar w kodzie:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_medium));
Kostek Polska
źródło
7
Nie wiem o OP, ale to była odpowiedź, której szukałem. Używałem COMPLEX_UNIT_DP myśląc, że muszę określić typ wejścia, a nie typ wyjściowy.
HenryAdamsJr
kiedy otrzymam rozmiar czcionki (zdefiniowany w sp), otrzymuję 60. Kiedy ustawiam go z powrotem za pomocą OMPLEX_UNIT_PX i wczytuję ponownie, otrzymuję 70. Wydaje się, że nie wszystko jest tutaj jasne
Gleichmut
2
Dlaczego nie mogę użyć rozmiaru tekstu TypedValue.COMPLEX_UNIT_SP?
dphans
3
@dphans Resources.getDimension()Metoda zwraca wartość, która jest już pomnożona przez odpowiednią metrykę
pkuszewski
2
@pkuszewski Wow, to takie zagmatwane.
Big_Chair
4

Obie metody getDimensionPixelSize () i getDimension () używają gęstości ekranu do obliczania pikseli. Gęstość ekranu twojego telefonu to oczywiście hdpi (240 dpi), więc używa skali 1,5 do konwersji dp na sp. Prosta matematyka 18 * 1,5 = 27.

Wygląda na to, że gęstość tabletu wynosi mdpi (160 dpi), więc skala wynosi tylko 1: 1.

Ale jeśli porównasz rzeczywisty rozmiar obu tekstów, powinien być taki sam.

Najlepszym sposobem jest po prostu utworzenie dwóch plików dimens.xml, jeden w folderze wartości dla telefonu, a drugi w value-sw600dp dla tabletów (możesz również użyć folderu values-sw720dp-land do przechowywania wymiarów 10-calowych tabletów w orientacji poziomej).

Więcej o wymiarach w Androidzie można przeczytać pod adresem : http://android4beginners.com/2013/07/appendix-c-everything-about-sizes-and-dimensions-in-android/

Android4Beginners
źródło