← Назад к вопросам

Какие знаешь методы жизненного цикла во View кроме onMeasure onLayout и onDraw?

1.0 Junior🔥 122 комментариев
#Жизненный цикл и навигация

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Методы жизненного цикла 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 для создания отзывчивых и стабильных интерфейсов.