受保护的字段对子类不可见

Ted*_*opp 15 java android protected subclass

我正在编写一个直接扩展的自定义视图android.view.View.如果我尝试访问字段mScrollXmScrollY,我看到一个错误,该字段"无法解析或不是字段".android.view.View源代码有mScrollX,mScrollY和声明的类似变量protected.我的直接子类怎么不能访问其父类的受保护字段?(像ScrollView这样的类显然可以.)

PS我意识到我可以打电话getScrollX(),但我想更新这些字段; 打电话setScroll()有我不想要的副作用.

Com*_*are 21

这是因为它们不是Android SDK的一部分.

以下是源代码mScrollX:

/**
 * The offset, in pixels, by which the content of this view is scrolled
 * horizontally.
 * {@hide}
 */
@ViewDebug.ExportedProperty(category = "scrolling")
protected int mScrollX;
Run Code Online (Sandbox Code Playgroud)

您会注意到@hide注释.这意味着这不是Android SDK的一部分.创建Android SDK的构建过程的一部分不会android.view.Viewandroid.jar您正在编译的文件的存根版本中包含此数据成员.

@hide注释用于该内部用途需要的是公共或保护,但一些开发人员的SDK,应使用不考虑的事情.

如果您遇到任何问题,请找到其他解决方案.

  • 嗯,有意思!因此,要解释一下这个理由:"我们无法理清正确的封装,所以我们颠覆了这种语言."...... (9认同)

Lio*_*ior 5

这非常直截了当:注意这些变量上方的@hide注释.它是一个特定于Android的注释,隐藏了公共SDK中的字段/方法.这就是你无法直接访问它们的原因.

Romain Guy在这篇文章中提到过它.

  • 隐藏某些字段或方法的事实通常是以下两种情况之一:1.它们可能会在SDK的未来版本中发生变化,因此他们希望减少应用程序不兼容的可能性,为您节省开发人员的大量工作维护您的应用程序,以及2.在您的情况下直接使用这些字段可能会干扰API在内部工作的正常工作. (2认同)