Java 安卓:为什么可以';我不能从视图中覆盖setFrame吗?
只是尝试扩展视图并进行一些自定义工作,但当我尝试重写setFrame方法时,Eclipse会抱怨。声明父类中没有要重写的方法: 类型测试的方法setFrame(int,int,int,int)必须重写或实现超类型方法 下面是来自AndroidSDK源代码的方法签名Java 安卓:为什么可以';我不能从视图中覆盖setFrame吗?,java,android,inheritance,extension-methods,overriding,Java,Android,Inheritance,Extension Methods,Overriding,只是尝试扩展视图并进行一些自定义工作,但当我尝试重写setFrame方法时,Eclipse会抱怨。声明父类中没有要重写的方法: 类型测试的方法setFrame(int,int,int,int)必须重写或实现超类型方法 下面是来自AndroidSDK源代码的方法签名 protected boolean setFrame(int left, int top, int right, int bottom) 正如您所看到的,它不是私有的或包级别的,甚至不是指定为最终的。。。只是受保护。这意味着我完全可以
protected boolean setFrame(int left, int top, int right, int bottom)
正如您所看到的,它不是私有的或包级别的,甚至不是指定为最终的。。。只是受保护。这意味着我完全可以在子类中重写它。对吗?下面是我在Eclipse中尝试做的最基本的事情。也许这只是一个Eclipse错误,但我不太熟悉使用Ant来检查它
编辑:对于那些回答setFrame没有在View类中定义的人,我可以向您保证它是。你认为我是怎样得到方法签名的?它甚至在layout()期间被调用。还是我真的疯了
git头:纸杯蛋糕(1.5r4): 您甚至可以看到该方法在和类中被重写…这就是为什么我严重困惑于为什么我不能直接从视图中重写它
public class Test extends View {
public Test(Context context) {
super(context);
}
public Test(Context context, AttributeSet attrs) {
super(context, attrs);
}
public Test(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected boolean setFrame(int left, int top, int right, int bottom) {
return super.setFrame(left, top, right, bottom);
}
}
因为根据文档,setFrame未在中定义,
setFrame
未在视图
类中定义(严格来说不是真的-请参见编辑)。令人惊讶的是,每个子类,TextView
和ImageView
,都是自己定义的。您必须为要覆盖此行为的每个小部件扩展特定的子类。这是基于Android 2.3 r1-2011年1月5日12:43的文档
请参阅文档:
定义setFrame的类和 编辑: 正如OP在评论中指出的,该方法在
View.java
源代码中有明确的定义。但是,文档的作用就好像这里没有定义方法一样
原因是视图中的setFrame()方法具有@hide Javadoc标记:
/**
* Assign a size and position to this view.
*
* This is called from layout.
*
* @param left Left position, relative to parent
* @param top Top position, relative to parent
* @param right Right position, relative to parent
* @param bottom Bottom position, relative to parent
* @return true if the new size and position are different than the
* previous ones
* {@hide}
*/
protected boolean setFrame(int left, int top, int right, int bottom) {
显然,这对Javadoc隐藏了方法:
特别需要注意的是@hide标记,标准doclet无法解释该标记,隐藏非SDK源代码,因此该代码不应在应用程序中使用
无法覆盖它的原因是否可能是Android的Eclipse插件或Android编译器以某种方式强制执行了@hide
标记?我不知道。更新了问题,链接到View.java、ImageView.java和TextView.java。视图定义setFrame,TextView和ImageView都会覆盖它。我只是想做同样的事。。。那么,是什么阻止了我呢?我想它可能也是最近的,但是你可以一直回到v1.5版的纸杯蛋糕,它是一样的@Nicholi我同意ADT插件,但是它的Google-Javadoc可以用来生成文档以外的东西,比如ADT强制执行的隐藏函数的黑名单。嗯,我想你可能是对的。我必须继续留意更多的@hide标签。在将您标记为答案之前,我将等待其他人是否有其他想法。@Nicholi-好吧,我很高兴能解开为什么文档与源代码不匹配的谜团-我今天学到了一些东西!作为记录,我使用JavaDoc来表示非文档。我在servlet代码中使用了一个特殊的Javadoc标记来“注释”(这是在真正的Java注释之前)和servlet和servlet参数。然后,我使用一个特殊的Javadoc处理器生成web.xml模板。更新了问题,并链接到View.java、ImageView.java和TextView.java。视图定义setFrame,TextView和ImageView都会覆盖它。想再解释一下吗?