Изменения дочерней иерархии Android lollipop ViewGroup?

У меня есть приложение с minSdk, равным 15, и я исправляю все ошибки, возникшие при обновлении леденца. Наше программное обеспечение очень сложное, и оно динамически создает представления, используя настраиваемые ViewGroups, а затем массив элементов, размеры которых явно заданы и которые помещаются внутрь группы. Я столкнулся с проблемой, когда, например, у меня будет ViewGroup, а первый дочерний объект - это кнопка... эта кнопка имеет размер, чтобы заполнить представление (не кликабельно). Второй дочерний элемент — это FrameLayout, содержащий одно представление. Это единственное представление является видеообъектом. Во всех предыдущих версиях Android это работало нормально. FrameLayout накладывается на кнопку (которая действует как фон), а видео находится внутри рамки. Вы можете взаимодействовать с видео без каких-либо проблем.

Что-то изменилось в леденце на палочке - внезапно, хотя кнопка отображается как элемент индекса 0, она лежит НАД остальными дочерними элементами... поэтому я не могу добраться до видео внизу. Если я удалю этот элемент кнопки, видео будет отображаться и воспроизводиться просто отлично... У меня нет проблем с взаимодействием с ним.

Я запустил приложение в UI Automator Viewer, чтобы убедиться, что я действительно настраиваю пользовательский интерфейс так, как ожидал (имейте в виду, что все представление динамически визуализируется во время выполнения с использованием ресурсов изображений/видео и файлов конфигурации xml).

Я не могу поделиться кодом, так как это проприетарное программное обеспечение, но я работаю над небольшим тестовым проектом, чтобы посмотреть, смогу ли я вручную воссоздать проблему со статическими объектами. Как только я его запущу, я обязательно обновлю этот тикет. А пока вот скриншот иерархии:

https://goo.gl/photos/a8on9CJDnN66XYnV6

Обратите внимание на выделенный объект, это пользовательская ViewGroup, дочерние элементы под ней — это то, что я описал выше.

Кто-нибудь знает об изменении в Lollipop, которое повлияет на порядок вещей? Ранее я обнаружил, что если у вас есть отключенный объект, но нет назначенного этому объекту отрисовки отключенного состояния, он станет невидимым, предыдущие версии просто использовали один из других отрисовок состояния.. хорошо, это имеет смысл, и это было очень легко исправить, но этот объект не является невидимым... значит, это должно быть что-то другое.

Любое направление будет с благодарностью. ~ А

ОБНОВЛЕНИЕ – ИСПРАВЛЕНО

С помощью @alanv и @BladeCoder я понял, что эта функциональность связана с новой функцией повышения высоты в дизайне материалов. Я смог исправить свою конкретную проблему, сначала проверив, какую версию Android использует устройство, и если леденец, я просто добавляю это новое свойство к кнопке:

android:stateListAnimator="@null"

Это предотвращает переопределение моей явной дочерней иерархии операционной системой.


person SpinGrrl    schedule 03.06.2015    source источник
comment
Вы как-то играете с возвышением взглядов?   -  person dominus    schedule 04.06.2015
comment
Кнопки имеют высоту по умолчанию из-за их аниматора списка состояний. Виды с высотой располагаются по оси z выше родственных видов. Вы можете удалить высоту, установив android:stateListAnimator="@null". Однако, если вы не хотите, чтобы кнопка отображалась, вам следует изменить ее видимость на исчезнувшую или невидимую.   -  person alanv    schedule 04.06.2015


Ответы (2)


Lollipop представил высоту как способ располагайте элементы по оси Z и отбрасывайте тени между ними в зависимости от их разницы высот.

Включенные кнопки имеют высоту по умолчанию 2 dp (и она увеличивается при нажатии на них). Итак, ваша кнопка имеет большую высоту, чем FrameLayout (по умолчанию 0dp), поэтому она будет нарисована поверх нее.

Отключенные кнопки имеют высоту 0dp. Вот почему отключение кнопки решило вашу проблему.

Использование кнопок в качестве фона выглядит плохой идеей (почему бы не установить собственный Drawable< /a> фон на вашем FrameLayout вместо этого?), но если вам это действительно нужно, вы можете отключить кнопку, как вы это сделали, и, просто чтобы быть уверенным, принудительно повысить ее уровень до 0dp. Другой обходной путь — увеличить высоту FrameLayout, но тогда он может отбрасывать большую тень под Lollipop, если у него есть фон, и, возможно, это не то, что вам нужно.

person BladeCoder    schedule 04.06.2015
comment
Спасибо @BladeCoder! Между вами и @alanv, который прокомментировал выше, я смог решить эту проблему. Я сделал это, просто проверив версию Android и, если она › 5.0, установил свойство android:stateListAnimator="@null" на кнопке. Я знаю, что кнопки - не лучший способ сделать это... это что-то для совершенно другого релиза. - person SpinGrrl; 19.06.2015

Хорошо, ОБНОВЛЯЕМ! Я понял, как решить проблему, хотя я до сих пор не уверен (даже после анализа различий между несколькими классами в grepcode), что изменилось в леденце на палочке, что вызывает изменение в том, как это работает.

Если кнопка включена... и вы размещаете ее с помощью чего-то эквивалентного AbsoluteLayout (у нас есть собственная ViewGroup, которую мы создали под названием Explicit layout, но она делает почти то же самое, что и AbsoluteLayout), она всегда будет поверх всего. else в стеке, который также не является какой-то кнопкой (по крайней мере, это то, что я нахожу... я не проверял все возможные виджеты).

Установка для кнопки, которая действует исключительно как фоновое изображение, значения enabled=false решает эту проблему. Я знаю, нет смысла использовать кнопки в качестве фоновых изображений, но наш код использует их для создания динамических элементов, поэтому существует множество возможных состояний и вариантов использования каждого элемента.

В любом случае, не уверен, что кто-то еще столкнется с этой проблемой, но на всякий случай... вот она.

Спасибо!

person SpinGrrl    schedule 03.06.2015
comment
Это работает, потому что аниматор списка состояний кнопки в стиле материала по умолчанию устанавливает высоту 0dp, когда кнопка отключена. См. мой комментарий к исходному сообщению для более полного решения. - person alanv; 04.06.2015