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

时间:2011-02-06 21:20:42

标签: java android subclass protected

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

P.S。我意识到我可以致电getScrollX(),但我想更新这些字段;调用setScroll()会产生我不想要的副作用。

3 个答案:

答案 0 :(得分: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;

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

@hide注释用于内部目的需要公开或受保护但不被认为是SDK开发人员应该使用的内容。

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

答案 1 :(得分:5)

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

Romain Guy mentioned it in这篇文章。

答案 2 :(得分:4)

您可以尝试使用反射设置字段:

import java.lang.reflect.Field;

// ...

try {
    Field scrollXField = View.class.getDeclaredField("mScrollX");
    scrollXField.setAccessible(true);
    scrollXField.set(this, myNewValue);
} catch (Exception ex) {
    // oops, android changed the implementation. sucks to be you.
}

但是,请注意,在执行此操作时,您依赖于未记录和不受支持的行为,因此您应该为在某些设备或将来版本中中断的内容做好准备。