Android:为什么我不能从视图中覆盖setFrame?

时间:2011-01-20 20:03:27

标签: java android inheritance extension-methods override

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

您甚至可以在ImageViewTextView课程中看到方法被覆盖 ...这就是为什么我为什么不能自己覆盖它而感到困惑的原因从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);
    }
}

2 个答案:

答案 0 :(得分:4)

根据文档,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

  

特别注意需要转向标准doclet无法解释的@hide标记以及 隐藏非SDK源代码,因此不应在应用程序中使用此代码< / EM> 即可。

是否有可能无法覆盖的原因是Android或Android编译器的Eclipse插件以某种方式强制执行@hide标记?我不知道。

答案 1 :(得分:1)

因为View class

中未定义setFrame