Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓:为什么可以';我不能从视图中覆盖setFrame吗?_Java_Android_Inheritance_Extension Methods_Overriding - Fatal编程技术网

Java 安卓:为什么可以';我不能从视图中覆盖setFrame吗?

Java 安卓:为什么可以';我不能从视图中覆盖setFrame吗?,java,android,inheritance,extension-methods,overriding,Java,Android,Inheritance,Extension Methods,Overriding,只是尝试扩展视图并进行一些自定义工作,但当我尝试重写setFrame方法时,Eclipse会抱怨。声明父类中没有要重写的方法: 类型测试的方法setFrame(int,int,int,int)必须重写或实现超类型方法 下面是来自AndroidSDK源代码的方法签名 protected boolean setFrame(int left, int top, int right, int bottom) 正如您所看到的,它不是私有的或包级别的,甚至不是指定为最终的。。。只是受保护。这意味着我完全可以

只是尝试扩展视图并进行一些自定义工作,但当我尝试重写setFrame方法时,Eclipse会抱怨。声明父类中没有要重写的方法:

类型测试的方法setFrame(int,int,int,int)必须重写或实现超类型方法

下面是来自AndroidSDK源代码的方法签名

protected boolean setFrame(int left, int top, int right, int bottom)
正如您所看到的,它不是私有的或包级别的,甚至不是指定为最终的。。。只是受保护。这意味着我完全可以在子类中重写它。对吗?下面是我在Eclipse中尝试做的最基本的事情。也许这只是一个Eclipse错误,但我不太熟悉使用Ant来检查它

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

git头:
纸杯蛋糕(1.5r4):

您甚至可以看到该方法在和类中被重写…这就是为什么我严重困惑于为什么我不能直接从视图中重写它

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未在

中定义,
setFrame
未在
视图
类中定义(严格来说不是真的-请参见编辑)。令人惊讶的是,每个子类,
TextView
ImageView
,都是自己定义的。您必须为要覆盖此行为的每个小部件扩展特定的子类。这是基于Android 2.3 r1-2011年1月5日12:43的文档

请参阅文档:

定义setFrame的类

编辑:

正如OP在评论中指出的,该方法在
View.java
源代码中有明确的定义。但是,文档的作用就好像这里没有定义方法一样

原因是
视图中的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隐藏了方法:

特别需要注意的是@hide标记,标准doclet无法解释该标记,隐藏非SDK源代码,因此该代码不应在应用程序中使用


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

更新了问题,链接到View.java、ImageView.java和TextView.java。视图定义setFrame,TextView和ImageView都会覆盖它。我只是想做同样的事。。。那么,是什么阻止了我呢?我想它可能也是最近的,但是你可以一直回到v1.5版的纸杯蛋糕,它是一样的@Nicholi我同意ADT插件,但是它的Google-Javadoc可以用来生成文档以外的东西,比如ADT强制执行的隐藏函数的黑名单。嗯,我想你可能是对的。我必须继续留意更多的@hide标签。在将您标记为答案之前,我将等待其他人是否有其他想法。@Nicholi-好吧,我很高兴能解开为什么文档与源代码不匹配的谜团-我今天学到了一些东西!作为记录,我使用JavaDoc来表示非文档。我在servlet代码中使用了一个特殊的Javadoc标记来“注释”(这是在真正的Java注释之前)和servlet和servlet参数。然后,我使用一个特殊的Javadoc处理器生成web.xml模板。更新了问题,并链接到View.java、ImageView.java和TextView.java。视图定义setFrame,TextView和ImageView都会覆盖它。想再解释一下吗?