findViewById

2020-09-21  本文已影响0人  陈萍儿Candy

findViewById分为两种,1.acivity中的findViewById

/**
 * Finds a view that was identified by the {@code android:id} XML attribute
 * that was processed in {@link #onCreate}.
 * <p>
 * <strong>Note:</strong> In most cases -- depending on compiler support --
 * the resulting view is automatically cast to the target class type. If
 * the target class type is unconstrained, an explicit cast may be
 * necessary.
 *
 * @param id the ID to search for
 * @return a view with given ID if found, or {@code null} otherwise
 * @see View#findViewById(int)
 * @see Activity#requireViewById(int)
 */
@Nullable
public <T extends View> T findViewById(@IdRes int id) {
    return getWindow().findViewById(id);
}

调用Window中的findViewById

/**
 * Finds a view that was identified by the {@code android:id} XML attribute
 * that was processed in {@link android.app.Activity#onCreate}.
 * <p>
 * This will implicitly call {@link #getDecorView} with all of the associated side-effects.
 * <p>
 * <strong>Note:</strong> In most cases -- depending on compiler support --
 * the resulting view is automatically cast to the target class type. If
 * the target class type is unconstrained, an explicit cast may be
 * necessary.
 *
 * @param id the ID to search for
 * @return a view with given ID if found, or {@code null} otherwise
 * @see View#findViewById(int)
 * @see Window#requireViewById(int)
 */
@Nullable
public <T extends View> T findViewById(@IdRes int id) {
    return getDecorView().findViewById(id);
}

2.最终调用的还是view中的findViewById

/**
 * Finds the first descendant view with the given ID, the view itself if
 * the ID matches {@link #getId()}, or {@code null} if the ID is invalid
 * (< 0) or there is no matching view in the hierarchy.
 * <p>
 * <strong>Note:</strong> In most cases -- depending on compiler support --
 * the resulting view is automatically cast to the target class type. If
 * the target class type is unconstrained, an explicit cast may be
 * necessary.
 *
 * @param id the ID to search for
 * @return a view with given ID if found, or {@code null} otherwise
 * @see View#requireViewById(int)
 */
@Nullable
public final <T extends View> T findViewById(@IdRes int id) {
    if (id == NO_ID) {
        return null;
    }
    return findViewTraversal(id);
}

view中的findViewTraversal

/**
 * @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;
}

此findViewTraversal一般被viewgroup重写,查找子view

/**
 * {@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;
}

For循环查找viewgroup中的每一个childView,调用子view的v.findViewById,在子view中的findViewTraversal方法中判断是否是此子view。

上一篇下一篇

猜你喜欢

热点阅读