Какие знаешь методы жизненного цикла во View кроме onMeasure onLayout и onDraw?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Методы жизненного цикла View в Android
Помимо ключевых методов onMeasure, onLayout и onDraw, которые отвечают за измерение, размещение и отрисовку View, существует множество других важных методов жизненного цикла, управляющих поведением, состоянием, взаимодействием и производительностью кастомных View. Вот основные группы и методы:
1. Методы инициализации и создания
-
Конструкторы View: Android предоставляет несколько конструкторов для инициализации View из кода или XML.
class CustomView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : View(context, attrs, defStyleAttr) { init { // Инициализация атрибутов из XML val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView) val customColor = typedArray.getColor(R.styleable.CustomView_customColor, Color.RED) typedArray.recycle() } } -
onFinishInflate(): Вызывается после инфляции View из XML, когда все дочерние View были добавлены. Полезно для настройки иерархии.
2. Методы управления фокусом и вводом
-
onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect): Вызывается при изменении состояния фокуса. Используется для изменения внешнего вида или поведения при фокусировке.
override fun onFocusChanged(gainFocus: Boolean, direction: Int, previouslyFocusedRect: Rect?) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect) if (gainFocus) { // Изменить фон или показать индикатор фокуса } } -
onKeyDown(), onKeyUp(): Обработка нажатий аппаратных клавиш.
-
onTouchEvent(MotionEvent event): Основной метод обработки касаний. Возвращает
true, если событие обработано. -
dispatchTouchEvent(): Распределение событий касания по иерархии View.
3. Методы состояния и сохранения
- onSaveInstanceState() и onRestoreInstanceState(Parcelable state): Сохранение и восстановление состояния View при повороте экрана или уничтожении Activity.
override fun onSaveInstanceState(): Parcelable? { val superState = super.onSaveInstanceState() val savedState = SavedState(superState) savedState.customProperty = this.customProperty return savedState } override fun onRestoreInstanceState(state: Parcelable?) { val savedState = state as SavedState super.onRestoreInstanceState(savedState.superState) this.customProperty = savedState.customProperty }
4. Методы прикрепления/отсоединения от окна
-
onAttachedToWindow(): Вызывается, когда View присоединяется к окну (Window). Идеально для запуска анимаций, регистрации широковещательных приёмников или слушателей.
override fun onAttachedToWindow() { super.onAttachedToWindow() startAnimation() registerReceiver() } -
onDetachedFromWindow(): Вызывается при отсоединении View от окна. Критически важно освобождать ресурсы, останавливать анимации и отменять подписки.
override fun onDetachedFromWindow() { stopAnimation() unregisterReceiver() super.onDetachedFromWindow() }
5. Методы видимости и включения
- onVisibilityChanged(View changedView, int visibility): Вызывается при изменении видимости View (VISIBLE, INVISIBLE, GONE).
- onWindowVisibilityChanged(int visibility): Отслеживает видимость окна, содержащего View. Полезно для паузы/возобновления операций.
- setEnabled(boolean enabled): Изменение состояния доступности View (включено/выключено).
6. Методы макета и размеров
- onSizeChanged(int w, int h, int oldw, int oldh): Вызывается при изменении размеров View. Полезно для перерасчёта позиций элементов.
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { super.onSizeChanged(w, h, oldw, oldh) // Пересчитать радиус круга при изменении размера radius = min(w, h) / 2f }
7. Методы отрисовки и инвалидации
- invalidate() и postInvalidate(): Запрос на перерисовку View (последний работает из не-UI потоков).
- requestLayout(): Запрос на перемеривание и переразмещение View.
- onDrawForeground(Canvas canvas): Отрисовка поверх основного контента (например, разделители, состояния).
8. Специализированные методы
- onScrollChanged(int l, int t, int oldl, int oldt): Для отслеживания прокрутки в ScrollView.
- onAnimationStart() и onAnimationEnd(): Обработка начала и завершения анимаций View.
- dispatchDraw(Canvas canvas): Отрисовка дочерних View.
- computeScroll(): Используется в связке с Scroller для создания плавной прокрутки.
Практическое применение
Понимание полного жизненного цикла View позволяет:
- Оптимизировать производительность, освобождая ресурсы в
onDetachedFromWindow() - Управлять состоянием через механизмы сохранения/восстановления
- Обрабатывать сложные взаимодействия с пользователем
- Синхронизировать анимации и обновления с видимостью View
- Избегать утечек памяти, правильно отписываясь от слушателей
Каждый метод имеет свою чёткую цель в архитектуре Android UI, и их правильное использование является признаком качественной реализации кастомных View. Важно не только знать эти методы, но и понимать порядок их вызова и взаимодействие с жизненным циклом Activity/Fragment для создания отзывчивых и стабильных интерфейсов.