- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
(对于上下文,)我试图将 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/
这个问题在这里已经有了答案: How to make a property protected AND internal in C#? (8 个答案) 关闭 9 年前。 我需要声明一个既受又 内部保
我有以下代码: class Base{ protected val alpha ="Alpha"; protected def sayHello = "Hello"; } class
我正在尝试运行一个宏来创建一个工作正常的pdf。 Excel 文件获得签名后,Excel 文件将自动受到保护。 问题:我的工作表上有一个按钮,需要按下该按钮才能创建 pdf 文档网。然而,这是无法完成
子类需要能够使用种子随机数生成器。 使用的优点和缺点是什么 public abstract class AbstractClass { protected Random rnd; public
我们有两个类(class)(A 和 B)。 A类只能由继承它的类创建(A类)B 类可以由用户创建。 A 类,版本 1 有一个private 数据成员,并且有方法访问 A 类中的数据。 A 类,版本 2
当父类受到保护时,我对继承类的默认构造函数有疑问,在我看来,子类也会有一个默认构造函数受到保护,但事实并非如此。 除了在子类上强制默认构造函数外,还有其他方法可以强制保护默认构造函数吗? C++11
我有一个抽象类,我想在其 protected 构造函数中初始化一个只读字段。我希望这个只读字段在派生类中可用。 按照我将所有字段设为私有(private)并公开属性的习惯,我实现如下: abstrac
我在运行大数据时遇到错误。错误已由以下示例示例解释 加载数据 mdata <- as.matrix(read.table('https://gubox.box.com/shared/static
我在获取 时遇到问题非法访问错误 对于以下示例: 我在名为 arch 的 gradle 模块中声明了一个基类 abstract class BaseClass { protected abst
我相信通过 实现 JSF 应用程序的安全性+ + & 通过使用 是两种不同的方式!?他们是吗? 我尝试通过上述第一种方法(使用 + + )来实现安全性,但发现使用 protected 和不
有没有办法确定以下的二传手能见度差异: public Prop { get; protected set; } protected Prop { get; set; } 使用反射?还是那些与 C# 反
我读了一本关于 OOP 的书,并且关于“ protected ”访问修饰符的示例对我来说很奇怪。 例子总结 这个例子是为了测试“protected”保留字对变量的影响。 ClassA 有 2 个 pr
内部——在集会上公开,在其他地方私有(private)。 protected - 只有派生类可以访问父类成员。 Protected internal - protected OR internal -
我有一个类代表 Wicket 中带有“返回”、“前进”和“取消”按钮的基本页面。但并非所有页面都有所有按钮,例如。 G。第一页明显没有“返回”。 我的想法是定义一个通用的ActionHandler p
在了解到嵌套类是嵌套类的成员并因此可以完全访问嵌套类的成员这一事实后(至少对于 C++11,请参见 here),我在尝试创建嵌套类模板: #include using namespace std;
我刚刚使用了 Resharper,并一直在尝试将字段转换为属性。我希望这些属性受到保护,但 Resharper 不想给我这个选项。相反,只有一个 protected 内部选项。这让我思考。要么某处有一
这是 question 的扩展一个小时前问过。 当覆盖派生类中的虚方法时,我们不能修改访问修饰符。考虑 System.Web.UI 命名空间中的 Control 类 public class Cont
有人可以解释一下 C# 中 protected 和 protected internal 修饰符之间的区别吗?看起来他们的行为是相同的。 最佳答案 “protected internal”访问修饰符是
我想知道下面两行代码之间是否有区别: protected $var = null; protected $var; 我已经看到两者都被使用了,我想知道这是否只是一个偏好问题,(也就是 $var; 将变
我正在尝试使用mockito为“另存为”操作编写单元测试。该操作的一部分是制作并显示一个文件对话框,用户可以在其中输入要保存的文件。选择文件不是我可以自动化的操作,因此我想模拟 FileDialog
我是一名优秀的程序员,十分优秀!