MotionLayout прерывает перерисовку (вложенных) подвидов

У меня проблемы с просмотром, который не обновляется в MotionLayout.

Похоже, что в какой-то момент механизм обновления / перерисовки MotionLayout перестает работать, и подвиды (включая вложенные) имеют случайные проблемы с обновлением на экране. Что я испытал до сих пор:

  1. RecyclerView иногда не обновляется. Это происходит, когда доступны новые данные, я использую библиотеку Paging для заполнения данных. Я исправил это с помощью обходного пути прокрутки 1 пикселя, когда я получил там новые данные - recyclerView.smoothScrollBy(0,1). После этого RecyclerView начинает нормально перерисовываться.
  2. When the keyboard is opened it randomly messes the nested subview redrawing. There is an issue in github ⁠here where a guy reproduces all this by adding an EditText to official MotionLayout examples. Some examples of the problems that I'm seeing:
    • I'm using TextInputLayout with app:endIconMode="clear_text" in MotionLayout -> ConstraintLayout -> TextInputLayout and the X button is sometimes not shown when I start typing (also after closing the keyboard).
    • TextView перерисован частично! Я показываю "No Results" или "No Posts" текст в TextView, переключаясь между ними на основе некоторой логики, но вместо обновления всего текста в пользовательском интерфейсе отображается только "No". Я отладил его, Layout Inspector говорит, что все в порядке, значение текстового представления "No Results", но я не вижу его на экране.
    • Некоторые другие анимации не работают, например, неопределенная анимация выполнения вложенных SwipeRefreshLayout

ВАЖНО: все проблемы с обновлением / перерисовкой устраняются, когда я выполняю переход! Когда я прихожу в какое-то запутанное состояние, когда 3 вложенных подпредставления заморожены / частично нарисованы, мне просто нужно нажать кнопку, которая запускает мой переход, и все они с радостью перерисовываются!

Пожалуйста, дайте мне знать, если это известная проблема и есть ли способ ее решения. Возможно, я мог бы сделать невидимый переход в 1 пиксель, но я даже не могу определить, когда обновление MotionLayout прерывается, обработка клавиатуры и новых данных RecyclerView, похоже, не покрывает все случаи. В противном случае мне придется вернуться к ConstraintLayout и самому подумать о реализации удивительной OnSwipe функциональности (если это вообще возможно в ConstraintLayout).


person frangulyan    schedule 03.04.2020    source источник
comment
см. мой комментарий, ответ. Также вы можете создать 2 отдельных вопроса SO. Прямо сейчас здесь есть в основном 2 вопроса, которые нехорошо обрабатывать в одном сообщении SO.   -  person muetzenflo    schedule 16.04.2020
comment
Возможно, я описал все немного беспорядочно, но на самом деле в моем вопросе одна проблема - MotionLayout не перерисовывает подпредставления до тех пор, пока не будет инициирован переход. Я просто привел несколько примеров или случаев, когда проблема воспроизводима.   -  person frangulyan    schedule 17.04.2020


Ответы (1)


Не совсем ответ, но слишком длинный для комментария:

Поскольку вы сталкиваетесь с несколькими проблемами, возможно, с несколькими первопричинами, я бы предложил создать проект Sandbox и воспроизводить каждую проблему за раз в безопасной и простой среде.

Мне кажется, что у вас есть одна проблема с библиотекой подкачки (в данном случае не с motionLayout) и другая проблема с EditText.

Вы должны проверить свой код подкачки без ML и проверить проблему EditText без прокрутки представлений. Я знаю, что это не большая помощь, но, возможно, руководство по решению этих проблем. Имейте в виду, что MotionLayout все еще находится в стадии бета-тестирования, и особенно версии 2.0.0-beta02 и beta03 были довольно запутанными с ошибками регрессии. Обновите до последней версии (beta04 на данный момент) или продолжайте использовать стабильную версию.

Иногда также помогает поиск официальных билетов MotionLayout.

person muetzenflo    schedule 16.04.2020
comment
1. Я уже нашел официальные тикеты, описывающие похожие проблемы других пользователей, и прокомментировал их, чтобы помочь разработчикам определить проблему. 2. Изменение одного слова в моих кодах - MotionLayout - ›ConstraintLayout устраняет все проблемы, так что это определенно проблема MotionLayout. 3. Как я уже писал в вопросе, уже есть что-то лучше, чем проект песочницы - официальный пример кода MotionLayout от Google, который имеет те же проблемы. Я также упомянул об этом разработчикам Google в официальных тикетах. - person frangulyan; 17.04.2020