Охота понять что конкретно происходит в этих методах. Заходим в класс View и видим вот что:
@Nullable
public final <T extends View> T findViewById(@IdRes int id) {
if (id == NO_ID) {
return null;
}
return findViewTraversal(id);
}
/**
* @param id the id of the view to be found
* @return the view of the specified id, null if cannot be found
* @hide
*/
protected <T extends View> T findViewTraversal(@IdRes int id) {
if (id == mID) {
return (T) this;
}
return null;
}
По простому я знаю объяснение - findviewbyId ищет view по id, которое мы указали в xml разметке. Так что конкретно здесь происходит?
Это методы класс View. findViewById валидирует аргумент id, при успешной валидации вызывается метод findViewTraversal (он отвечает за поиск внутри View(себя)). Он проверяет принадлежит ли ему искомый id.
Чтоб понять зачем вообще так сделано нужно посмотреть еще класс ViewGroup extend View (он прямой потомок View). Это базовый класс для всех видов контейнеров: LinerLayout, RelativeLayout и тд. Он переопределяет findViewTraversal (он отвечает за поиск внутри ViewGroup (себя)). В методе findViewTraversal мы берем каждую View и спрашиваем ее, принадлежит ли ей искомый id через методы которые описаны в вашем вопросе.
/**
* {@hide}
*/
@Override
protected <T extends View> T findViewTraversal(@IdRes int id) {
if (id == mID) {
return (T) this;
}
final View[] where = mChildren;
final int len = mChildrenCount;
for (int i = 0; i < len; i++) {
View v = where[i];
if ((v.mPrivateFlags & PFLAG_IS_ROOT_NAMESPACE) == 0) {
v = v.findViewById(id);
if (v != null) {
return (T) v;
}
}
}
return null;
}
Таким образом мы можем искать элементы по айди в любых видах представления (View).
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости