@Dementor
программист, архитектор, аналитик

Почему getDimension() возвращает результат в 1,5 раза больше указанного в dimens.xml?

У меня есть файл ресурсов dimens.xml с таким содержимым (для теста):
<resources>
    <dimen name="tab_padding">16dp</dimen>
    <dimen name="title_text_size">20sp</dimen>
    <dimen name="row_text_size">17sp</dimen>
</resources>

С использованием напрямую в xml-файле макета все хорошо, но возникают проблемы при программной верстке выражениями вида:
txtView.setTextSize(getResources().getDimension(R.dimen.row_text_size));

Отладка показала, что проблема в функции getDimension(), которая все измерения увеличивает в 1,5 раза. В табло Expressions я получил такие результаты (сравните с изначальными значениями в файле ресурсов):

getResources().getDimension(R.dimen.tab_padding) = 24
getResources().getDimension(R.dimen.title_text_size) = 30
getResources().getDimension(R.dimen.row_text_size) = 25,5


Так в чем же проблема? Кто-нибудь слышал про подобное?

P.S. У меня была гипотеза, что android так криво пересчитывает sp в dp. Как видите по файлу я уже начал экспериментировать с единицами измерения, но и явное введение dp тоже ничего не прояснило :(

Решение! Благодаря наводке от one pavel понял, что пересчет происходит в единицу px. Т.е. в моем случае достаточно сделать:
txtView.setTextSize(
      TypedValue.COMPLEX_UNIT_PX, 
      getResources().getDimension(R.dimen.row_text_size));
  • Вопрос задан
  • 3452 просмотра
Решения вопроса 1
@onepavel
Консультация и разработка мобильных приложений
В документации четко написано
Returns: Resource dimension value multiplied by the appropriate metric.
developer.android.com/reference/android/content/re...

а если погуглить, первые две ссылки
stackoverflow.com/questions/6784353/inconsistency-...
stackoverflow.com/questions/14540293/get-dimension...

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

Чтобы было хорошо, было придумано создание values для разных типов экранов
https://developer.android.com/samples/MediaRouter/...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы