作者:手机用户2502935197 | 来源:互联网 | 2023-09-18 15:42
只是尝试扩展View并做一些自定义工作,但是当我尝试覆盖setFrame方法时Eclipse会抱怨.声称父类中没有方法可以覆盖:
The method setFrame(int, int, int, int) of type Test must override or implement a supertype method
这是android SDK源码方法的签名.
protected boolean setFrame(int left, int top, int right, int bottom)
正如你所看到的那样,它不是私有的或包级别的,甚至被指定为最终的……只是受到保护.这应该意味着我完全能够在子类中覆盖它.对?以下是我在Eclipse中尝试做的最低限度.也许这只是一个Eclipse错误,但我不太熟悉使用Ant来检查它.
编辑:对于那些回答未在View类中定义setFrame的人,我可以向你保证.你怎么认为我有方法签名?甚至在layout()期间调用它.还是我真的只是疯了?
git HEAD:View.java
蛋糕(1.5r4):View.java
您甚至可以在ImageView和TextView课程中看到正在覆盖的方法……这就是为什么我很难弄清楚为什么我不能直接从View中覆盖它…
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没有在View类中定义(严格来说不是真的 – 请参阅编辑).令人惊讶的是,每个子类TextView和ImageView都自己定义它.您必须为要覆盖此行为的每个窗口小部件扩展特定子类.这是基于Android 2.3 r1 – 05 Jan 2011 12:43的文档.
查看文档:
定义setFrame的类
http://www.google.com/search?q=site:developer.android.com+%22boolean+setFrame%22
TextView和ImageView.
编辑:
正如OP在注释中指出的那样,该方法在View.java源代码中明确定义.但是,文档的行为就像在那里没有定义方法一样.
原因是View中的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的方法:
http://www.androidjavadoc.com/?p=63
The especial [sic] attention is need to turn to the @hide tag which standard doclet can’t interpret and which hides non-SDK source and thus this code shouldn’t be used in applications.
是否有可能无法覆盖的原因是Android或Android编译器的Eclipse插件以某种方式强制执行@hide标记?我不知道.