只是尝试扩展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头:View.java
纸杯蛋糕(1.5r4):View.java
您甚至可以在ojit_a和ImageView类中看到该方法被覆盖了...这就是为什么我对自己不能直接从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
需要特别注意的是@hide标记,它是标准doclet无法解释的,而隐藏了非SDK源,因此,不应在应用程序中使用此代码。
可能无法覆盖的原因是Android或Android编译器的Eclipse插件以某种方式强制了
@hide
标记吗?我不知道。