1

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

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

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

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

https://goo.gl/photos/a8on9CJDnN66XYnV6

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

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

Любое направление было бы рад. ~ A

UPDATE - ИСПРАВЛЕНО

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

андроида: stateListAnimator = «@ нулю»

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

+0

Вы играете с возвышением взглядов каким-то образом? – dominus

+1

Кнопки имеют высоту по умолчанию из-за их аниматора состояний. Представления с возвышением z-упорядочены над видами сестры. Вы можете удалить высоту, установив 'android: stateListAnimator =" @ null "'. Если вы не хотите, чтобы кнопка отображалась, вы должны изменить свою видимость, чтобы исчезнуть или невидимо. – alanv

ответ

1

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

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

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

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

+1

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

1

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

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

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

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

Спасибо!

+1

Это работает, потому что аниматор состояния по умолчанию в стиле материала, заданный по умолчанию, устанавливает значение 0dp, когда кнопка отключена. См. Мой комментарий к исходному сообщению для более полного решения. – alanv