只是尝试扩展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

您甚至可以在o​​jit_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(严格意义上不是真的-请参见编辑)。令人惊讶的是,每个子类TextViewImageView自己定义了它。您必须为要覆盖此行为的每个小部件扩展特定的子类。这基于Android 2.3 r1 - 05 Jan 2011 12:43的文档。

请参阅文档:

定义setFrame的类
http://www.google.com/search?q=site:developer.android.com+%22boolean+setFrame%22

TextViewImageView

编辑:

正如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标记吗?我不知道。

10-08 01:30