我正在编写一个直接扩展android.view.View
的自定义视图。如果我尝试访问字段mScrollX
或mScrollY
,我会看到“无法解析或不是字段”字段的错误。 source code for android.view.View具有mScrollX,mScrollY和声明为protected
的类似变量。我的直接子类怎么不能访问其父类的受保护字段? (像ScrollView这样的类似乎可以。)
P.S。我意识到我可以致电getScrollX()
,但我想更新这些字段;调用setScroll()
会产生我不想要的副作用。
答案 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中的字段/方法。这就是你无法直接访问它们的原因。
答案 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.
}
但是,请注意,在执行此操作时,您依赖于未记录和不受支持的行为,因此您应该为在某些设备或将来版本中中断的内容做好准备。