Подтвердить что ты не робот

Получить измерение из XML и задать размер текста во время выполнения

В dimens.xml у меня есть:

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

Во время выполнения я получаю это значение и задаю размер текстового вида:

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

На 10-дюймовом планшете (1280 x 800) все в порядке; но по телефону (800 x 480) текстовое представление имеет очень большой шрифт. На планшете размер равен 18; по телефону, 27.

Если я задаю размер вручную, выполните следующие действия:

textView.setTextSize(size)

размер на обоих устройствах нормальный.

4b9b3361

Ответ 1

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

Задайте размер в коде:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_medium));

Ответ 2

Оба метода getDimensionPixelSize() и getDimension() используют плотность экрана для вычисления пикселей. Плотность экрана телефона, очевидно, hdpi (240 точек на дюйм), поэтому для преобразования dp в sp. Простая математика 18 * 1,5 = 27.

Кажется, что плотность вашего планшета равна mdpi (160dpi), поэтому масштаб составляет всего 1:1.

Но если вы сравниваете реальный размер обоих текстов, это должно быть одинаково.

Лучший способ - просто создать два файла dimens.xml в папке значений для телефона, а другой - в значениях sw600dp для планшетов (вы можете использовать также папку значений-sw720dp-land для хранения размеров для 10-дюймовых планшетов в альбомной ориентации).

Вы можете узнать больше об измерениях на Android по адресу: http://android4beginners.com/2013/07/appendix-c-everything-about-sizes-and-dimensions-in-android/

Ответ 3

Вы можете использовать sdp (Масштабируемые пиксели desyscity) https://github.com/intuit/sdp вместо dp, это определенно спасет вашу жизнь