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

101

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

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

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

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

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

Если я установил размер вручную:

textView.setTextSize(size)

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

Юра Шинкарев
источник

Ответы:

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

Установите размер в коде:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_medium));
Костек Польша
источник
7
Я не знаю насчет ОП, но это был ответ, который я искал. Я использовал COMPLEX_UNIT_DP, думая, что мне нужно указать тип ввода, а не тип вывода.
HenryAdamsJr
когда я получаю свой размер шрифта (определенный в sp), я получаю 60. Когда я устанавливаю его обратно с помощью OMPLEX_UNIT_PX и снова получаю, я получаю 70. Кажется, здесь не все ясно
Gleichmut
2
Почему я не могу использовать размер текста TypedValue.COMPLEX_UNIT_SPвместо этого?
dphans
3
@dphans Resources.getDimension()Метод возвращает значение, которое уже умножено на соответствующую метрику
pkuszewski
2
@pkuszewski Вау, это так сбивает с толку.
Big_Chair
4

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

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

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

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

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

Android4Начальный
источник
1

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

Ааюшман чаудхоры
источник