Реализуйте обход дерева View и явно выберите поведение при отсутствии ID. Лучше назвать расширение иначе: одноимённый member findViewById имеет приоритет над extension.
Создание собственного метода поиска View по идентификатору
Реализуйте обход дерева 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.