只是尝试扩展View并执行一些自定义工作,但是当我尝试覆盖setFrame方法时Eclipse会抱怨。声称父类中没有方法可以覆盖:
Test类型的方法setFrame(int,int,int,int)必须覆盖或实现超类型方法
这是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);
}
}
答案 0 :(得分:4)
根据文档,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
修改强>
正如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
特别注意需要转向标准doclet无法解释的@hide标记以及 隐藏非SDK源代码,因此不应在应用程序中使用此代码< / EM> 即可。
是否有可能无法覆盖的原因是Android或Android编译器的Eclipse插件以某种方式强制执行@hide
标记?我不知道。
答案 1 :(得分:1)