Объясните что происходит в метадах findViewById и findViewTraversal

230
14 марта 2019, 02:00

Охота понять что конкретно происходит в этих методах. Заходим в класс 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 разметке. Так что конкретно здесь происходит?

Answer 1

Это методы класс 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).

READ ALSO
Java android connect to wifi

Java android connect to wifi

можете подсказать, в чем ошибка?

134
Кастомная авторизация Spring REST API

Кастомная авторизация Spring REST API

Как грамотно и удобно организовать аутентификацию в Spring REST Api через JWT? Сессию не хочу использовать, потому что это REST и JWTПроверка токена должна...

197
приложение OCR для андроида

приложение OCR для андроида

Я создаю приложение, которое распознает текст из фото, У меня почти всё готово, но приложение распознает весь участок изображения, Мне необходимо...

168
Java Возврат неправильного числа

Java Возврат неправильного числа

Строка лишь один раз возвращает отрицательное числоЧего не хватает чтобы возвращала при каждом вводе отрицательно числа в if (ln < 0 );

152