在XML布局中使用自定义视图

时间:2012-06-29 18:46:22

标签: java android

我有自定义视图:

public class Loading extends View {

    private long movieStart;
    private Movie movie;

    public Loading(Context context, InputStream inputStream) {
        super(context);
        movie = Movie.decodeStream(inputStream);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        super.onDraw(canvas);
        final long now = SystemClock.uptimeMillis();
        if(movieStart == 0)
            movieStart = now;
        final int relTime = (int)((now - movieStart) % movie.duration());
        movie.setTime(relTime);
        movie.draw(canvas, 0, 0);
        this.invalidate();
    }

}

如何在XML布局中使用此视图?如何在XML布局中传递参数(Context,InputStream)?

3 个答案:

答案 0 :(得分:0)

How can I use this view in XML layout?

...

 <pacakge_of_class.Loading 
            android:id="@+id/y_view1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

http://developer.android.com/guide/topics/ui/custom-components.html

当从代码和form that is called when the view is inflated from a layout file. The second form should parse and apply any attributes defined in the layout file创建视图时,会调用构造函数的一种形式。

How can I pass the parameters 

https://stackoverflow.com/a/4495745/804447

Error referencing an inner class View in layout/main.xml

<view class="Your_package.MainClass$Loading" />

答案 1 :(得分:0)

简短的回答是你不能直接这样做。

答案很长,你可以间接地做到这一点。

通过其完全限定名称(正如其他人提到的那样)将视图添加到XML,然后:

您需要做的是从View实现常规构造函数。定义一个自定义属性,声明用于在构造函数中创建InputStream的资源。视图系统会自动为您提供上下文,然后您需要根据提供的属性值打开InputStream。

答案 2 :(得分:0)

您可以在XML-Layout中使用自定义视图,如下所示:

<com.your.package.Loading 
    android:id="@+id/y_view1"
    ... />

但是你不能使用自己的构造函数,你必须使用this answer中所示的构造函数。

所以你必须通过代码访问你的加载视图,手动设置InputStream:

Loading yourView = (Loading) findViewById(R.id.yourLoadingView);
yourView.setInputStream();

您在Loading班级中使用此setter方法:

public void setInputStream(InputStream inputStream){
    movie = Movie.decodeStream(inputStream);
}