【问题标题】:Why are certain protected methods in ViewGroup not overridable and not in the docs?为什么 ViewGroup 中的某些受保护方法不能被覆盖,也不能在文档中?
【发布时间】:2016-01-27 22:20:27
【问题描述】:

(对于上下文,)我正在尝试将 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 语言的某些部分,因为我认为受保护的方法可以通过继承获得? findViewTraversal() 也不存在于 Android 文档中,因此它显然不适合使用,但我不明白它是如何不能

【问题讨论】:

  • 我试图找出答案,但找不到明确的答案。您可能会找到帮助herehere (jls)
  • 只是与您在此处实际尝试实现的目标相关的评论(“将 GridView 扩展为类似于 ListView 并具有页眉和页脚”):您是否搜索过现有的解决方案?我很确定有。或者,考虑使用 RecyclerViewGridLayoutManager - 这将允许您相当容易地添加页眉/页脚(通过使项目跨越多列)。

标签: java android gridview


【解决方案1】:

(...) 它也存在于 ViewGroup 的源代码中,这意味着它应该在 GridView 中。

正确,确实如此。看不到的原因,是因为方法注解了@hide

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

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

返回@hide:是documented here

当应用于包、类、方法或字段时,@hide 会从文档中删除该节点及其所有子节点。

基本上,注释表明该方法不是公共 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) { ... }

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2013-07-01
    相关资源
    最近更新 更多