onDraw в пользовательском представлении больше не выполняется после onStop/onStart

Я использую пользовательский вид для рисования слайдера (с двумя ручками).

Пользовательское представление расширяет ConstraintLayout, я устанавливаю setWillNotDraw() в конструкторе, и все работает нормально - пока фрагмент, содержащий пользовательское представление, не остановится и не запустится снова. Начиная с этого момента, метод onDraw больше не выполняется после вызова invalidate(). Во время отладки я проверил флажок willNotDraw-Flag, и он по-прежнему имеет значение false.

  • Я пользуюсь kotlinx
  • Я вызываю setWillNotDraw (false) в блоке инициализации
  • Я проверил, если созданный фрагмент создается дважды, но все выглядит вполне нормально.
  • Я заверил, что invalidate () вызывается.
  • Я заверил, что willNotDraw() имеет значение false.
  • Пользовательский вид добавляется к фрагменту в layout.xml
  • onCreate, onCreateView, onViewCreated фрагмента вызывается только один раз

Блок init в пользовательском представлении:

init {
  View.inflate(context, R.layout.layout_slider, this)
  setWillNotDraw(false)
}

Функция onDraw в пользовательском представлении:

override fun onDraw(canvas: Canvas?) {
  super.onDraw(canvas)

  Timber.d("onDraw")
}

После остановки и запуска содержащий фрагмент onDraw больше не выводится, а все остальное работает нормально.

1 ответ

Когда я написал свой вопрос, я позвонил invalidate() везде, где я хотел перерисовать вид.

Я изменил блок инициализации на

init {
  view = inflate(context, R.layout.layout_slider, this)

  setWillNotDraw(false)
}

и использовать view?.invalidate() вместо invalidate(),

Теперь все работает нормально, хотя я понятия не имею, почему это должно иметь значение? Кто-нибудь есть идеи по этому поводу?

Другие вопросы по тегам