Создание собственного метода поиска View по идентификатору

Реализуйте обход дерева View и явно выберите поведение при отсутствии ID. Лучше назвать расширение иначе: одноимённый member findViewById имеет приоритет над extension.

Короткий ответ

Что ответить на собеседовании

Реализуйте обход дерева View и явно выберите поведение при отсутствии ID. Лучше назвать расширение иначе: одноимённый member findViewById имеет приоритет над extension.

Подробный разбор

Ответ с пояснениями

Условие

Требуется написать функцию‑расширение, которая будет выполнять те же действия, что и встроенный findViewById, принимая целочисленный идентификатор и возвращая найденный объект View.

fun View.findViewById(viewId: Int): View

Ответ

Реализуйте обход дерева View и явно выберите поведение при отсутствии ID. Лучше назвать расширение иначе: одноимённый member findViewById имеет приоритет над extension.

fun View.findDescendant(viewId: Int): View? {
    if (viewId == View.NO_ID) return null
    if (id == viewId) return this
    if (this is ViewGroup) {
        for (i in 0 until childCount) {
            val found = getChildAt(i).findDescendant(viewId)
            if (found != null) return found
        }
    }
    return null
}

Поиск O(n), рекурсивный стек O(h). В исходной сигнатуре возвращаемый View не nullable: тогда отсутствие элемента должно приводить к явно оговорённому исключению, например через requireNotNull, а не к неявному null.

Источник: kotlinlang.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее