Как получить размер дисплея в xml разметке

261
16 января 2017, 19:36

Библиотека com.android.support:percent:25.0.1 позволяет работать с процентами. Значит можно получить и размер дисплея в пикселях в xml. Как ?

Answer 1

Коллега,

Вы похоже, не совсем точно представляете как работает оконная система Android'а

XML это ваши пожелания как бы вы хотели, чтобы выглядел экран. Далее начинается развертка ваших хотелок на физическом экране. Развертка выполняется в 2 этапа:

  1. Делается замер размеров с учетом пожеланий указанных в XML и ограничений заданных родителем. Это часть выполняется методом View.measure(), метод вызывает onMeasure(), который может быть перехвачен разработчиком.
  2. Далее присваиваются актуальные размеры вычисленные в ходе measure/onMeasure() - это производится методом View.layout(), в ходе присвоения размеров вызывается onLayout(), который также может быть перехвачен.

Замер размеров и присвоение происходит динамически то есть runtime, соответственно, отсутствует способ задать статические размеры в XML.

Динамически найти размеры экрана устройства не представляет никакой сложности, код типа:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x; //ширина экрана в пикселях
int height = size.y; //высота экрана в пикселях

Эти размеры по идее вы должны использовать в onMeasure()/onLayout(), для того чтобы придать желаемый размер вашему кастомному View

Погуглите на тему custom+view+android

Answer 2

Работа с px не рекомендуется, это где такое сказано? Любые динамические манипуляции в коде будут проходить в px, поэтому зачастую перед более большим проектом пишется утилита, которая генерирует px -> dp, для удобной работы, но по факту, 'почти' все динамические измерения в px. Что касается вопроса, библиотека и получения размеров это две разные вещи, библиотека для того и нужна чтоб, не получать эти размеры, а смело ставить проценты, а она в коробке сама считает все остальное. Ну а если вы уже вытащили размеры вашего парента, не надо много ума, чтоб разделить этот размер на размер вашего элемента и получить те же самые проценты, или поставить процент от вашего размера, чтоб задать нужный размер уже в пикселях, ну или если вернутся в начало можно использовать свою утиль, чтоб удобно ставить в % а на выходе иметь dp.

PS Bonus: В такой ситуации рекомендую использовать FrameLayout, он хорошо подойдет именно для таких манипуляций, а для списков может дать значительный прирост производительности, парой очень большой. Такие примеры можно увидеть в глобальных OpenSource, в топовых мессенджерах и файлменеджерах...

READ ALSO
Регулярное выражение

Регулярное выражение

Нужно написать регулярное выражение, которое могло бы достать любую ссылку из данного тэга:

287
Получить количество совпадений AutoComleteTextView

Получить количество совпадений AutoComleteTextView

Имею AutoCompleteTextViewХочу изменить цвет текста, если нет совпадений

240