Как определить, что перерисовка экрана завершена после закрытия программной клавиатуры - PullRequest
0 голосов
/ 07 сентября 2018

В моем приложении для Android у меня есть действие, содержащее вложенные фрагменты, со свойством, имеющим свойство:

android:windowSoftInputMode="adjustResize"

Один из вложенных фрагментов содержит кнопку, которая при нажатии открывает фрагмент диалога непосредственно над тем местом, где расположена кнопка.

Когда эта кнопка нажата, когда программная клавиатура открыта, программная клавиатура автоматически закроется. Однако проблема, с которой я сталкиваюсь, заключается в том, что фрагмент диалога будет отрисован на основе положения кнопки до закрытия программной клавиатуры, а не после того, как программная клавиатура закрылась и перерисовка экрана была завершена.

То, что я сделал до сих пор:

  • В событии onClick проверьте, открыта ли программная клавиатура - если это так, не открывайте фрагмент диалога сразу (вместо этого установите флаг)
  • Фрагмент реализует View.OnLayoutChangeListener - когда вызывается onLayoutChange (), он проверяет флаг, чтобы увидеть, нужно ли открывать фрагмент диалога (если это так, он получает координаты кнопки в это время и открывает фрагмент диалога)

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

Поэтому мне нужно знать, когда экран закончил перерисовку, чтобы я мог убедиться, что кнопка находится в правильном положении до открытия фрагмента диалога.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Полагаю, теперь у меня есть решение этой проблемы ...

  1. Используйте View.OnLayoutChangeListener.
  2. В функции onLayoutChange () я создаю локальную трансляцию, чтобы открыть фрагмент диалога, который проходит через представление в трансляции.
  3. Только один раз в функции BroadcastManager onReceive () следует получить координаты кнопки перед созданием DialogFragment.

Насколько я понимаю, это работает, потому что функция onReceive () вызывается в потоке пользовательского интерфейса, что означает, что она будет выполняться в том же потоке, но, что наиболее важно, после перерисовки экрана.

0 голосов
/ 07 сентября 2018

Вы можете реализовать View.OnLayoutChangeListener для вашего ButtonView вместо Fragment

...