【问题标题】:Android: Why Can't I Override setFrame From View?Android:为什么我不能从视图中覆盖 setFrame?
【发布时间】:2011-01-20 20:03:27
【问题描述】:

只是尝试扩展 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 来检查它。

编辑:对于那些回答 setFrame 未在 View 类中定义的人,我可以向您保证它是。你认为我怎么得到方法签名?它甚至在 layout() 期间被调用。还是我真的疯了?

git 头: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);
    }
}

【问题讨论】:

    标签: java android inheritance extension-methods overriding


    【解决方案1】:

    根据文档,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在cmets中指出的那样,该方法在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 源代码,因此不应在应用程序中使用此代码。

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

    【讨论】:

    • 更新了问题,其中包含指向 View.java、ImageView.java 和 TextView.java 的链接。 View 定义了 setFrame,TextView 和 ImageView 都覆盖了它。我只是想这样做……那么,是什么阻止了我?
    • 我认为它可能也是最近的,但你可以一直回到 v1.5 Cupcake,它是一样的。 android.git.kernel.org/?p=platform/frameworks/…
    • @Nicholi 我同意 ADT 插件,但它的 Google - Javadoc 可用于生成文档以外的内容,例如 ADT 强制执行的隐藏函数黑名单。
    • 嗯,我想你可能是对的。我将不得不继续寻找更多@hide 标签。在将您标记为答案之前,将等待看看其他人是否有其他想法。
    • @Nicholi - 好吧,我很高兴解开文档与源代码不匹配的谜团 - 我今天学到了一些东西!作为记录,我使用 JavaDoc 来编写非文档。我在 servlet 代码中使用了一个特殊的 Javadoc 标记来“注释”(这是在真正的 Java 注释之前)和 servlet 和 servlet 参数。然后我使用了一个特殊的 Javadoc 处理器来生成 web.xml 模板。
    【解决方案2】:

    因为View class中没有定义setFrame

    【讨论】:

    • 更新了问题,其中包含指向 View.java、ImageView.java 和 TextView.java 的链接。 View 定义了 setFrame,TextView 和 ImageView 都覆盖了它。愿意解释更多吗?
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多