gpt4 book ai didi

java - 为什么 ViewGroup 中的某些 protected 方法不可重写并且不在文档中?

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:49 26 4
gpt4 key购买 nike

(对于上下文,)我试图将 GridView 扩展为类似 ListView 并具有页眉和页脚,但 findViewById 不起作用。当我查看 ListView 的源代码时,我发现:

@Override
protected View findViewTraversal(int id) {
View v;
v = super.findViewTraversal(id);
...
}

然而 Android Studio(和 Gradle)告诉我 findViewTraversal 不存在,尽管它存在于 ViewGroup's source 中同样,这意味着它应该位于 GridView 中。

为什么我无法在子类中重写此方法?

我是否遗漏了 Java 语言的某些部分,因为我认为 protected 方法可以通过继承获得? findViewTraversal() 也不存在于 Android 文档中,因此它显然不适合使用,但我不明白它为什么不能

最佳答案

(...) it exists in ViewGroup's source as well, meaning it should be in GridView.

正确,确实如此。您看不到它的原因是该方法用 @hide 注释:

/**
* {@hide} <-- !!!
*/
@Override
protected View findViewTraversal(int id) { ... }

从您自己的 ViewGroup 链接中很难看出,但如果您仔细查看行号,您会注意到跳跃。如果您现在查看 raw source该文件的内容应该变得更加清晰。小旁注:您引用的是ViewGroup非常的旧版本。

返回@hide:它是 documented here :

When applied to a package, class, method or field, @hide removes that node and all of its children from the documentation.

基本上,注释表明该方法不是公共(public) API 的一部分,因此不应公开。在 Android Studio 中,注释还具有阻止方法显示的副作用(不确定 Eclipse),因此您不会“意外”使用它。

现在,ListView 是一个特例。 唯一 ViewGroup 实际覆盖 findViewTraversal(int id) 方法(不包括 ExpandableListView,因为它扩展了 ListView):

/* (non-Javadoc)
* @see android.view.View#findViewById(int)
* First look in our children, then in any header and footer views that may be scrolled off.
*/
@Override
protected View findViewTraversal(@IdRes int id) { ... }

如果您查看上面的源代码 fragment ,您会发现它覆盖了“隐藏” super 方法,并且没有@hide注释。因为它确实包含 (non-Javadoc) ,我只能假设它是有意作为 ListView 公共(public) API 的一部分公开的。因此,它实际上列在method documentation中。 ,但当然仅限于本类(class)。

简而言之:该方法对于每个 ViewGroup 都存在,但默认情况下(故意)不公开。在有人问之前:是的,您仍然可以使用反射来访问/调用该方法,但我不会依赖于此。该方法不属于公共(public) API 是有原因的。

关于java - 为什么 ViewGroup 中的某些 protected 方法不可重写并且不在文档中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33386043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com