Java类成员没有在构造函数中初始化?

时间:2015-03-04 13:48:30

标签: java android

我试图在Android中制作自定义视图。在调用r时,似乎没有初始化类成员onDraw()。但是paint仍然成功初始化(如果我从构造函数中删除该行,则app force关闭)。在最后一行,我有画布绘制r1,它成功并绘制一个蓝色矩形。如果我将r1替换为r,则它只是白色。

这是我的问题的简化版本。我一直在为构造函数中初始化的数组成员获取空指针异常。但无论如何,问题似乎都是一样的。为什么它不能保持实例化?

public class ColorListView extends View {
Paint paint;
Rect r;

public ColorListView (Context context, AttributeSet attrs){
    super(context, attrs);
    paint = new Paint();
    r = new Rect(0,0,getWidth(),getHeight());
}


protected void onDraw (Canvas canvas){
    paint.setColor(Color.BLUE);
    Rect r1 = new Rect(0,0,getWidth(),getHeight());
    canvas.drawRect(r1, paint); // doesn't work if r is passed to drawRect?
}}

3 个答案:

答案 0 :(得分:1)

做这样的事情怎么样: 在你调用构造函数的地方

ColorListView myView = new ColorListView(context, attrs);
myView.createRectangle();
myView.invalidate();

在课堂上

public class ColorListView extends View {
    Paint paint;
    Rect r;

    public ColorListView (Context context, AttributeSet attrs){
        super(context, attrs);
        paint = new Paint();
    }


    protected void onDraw (Canvas canvas){
        paint.setColor(Color.BLUE);
        canvas.drawRect(r, paint);
    }

    public void CreateRectangle() {
        Rect r = new Rect(0,0,getWidth(),getHeight());
    }
}

或者查找实际创建视图的时间。以上是我刚才提出的一种快速方法。我不记得视图何时被创建/测量。

PS - 我刚看到答案onMeasure(),我不好意思:P

答案 1 :(得分:0)

在测量View之前初始化Rect r,因此getWidth和getHeight为0。

尝试在视图的onMeasure之后初始化它。

此外,这是一个不好的做法

Rect r1 = new Rect(0,0,getWidth(),getHeight());

中的

onDraw (Canvas canvas)

你应该避免在那里分配对象。

答案 2 :(得分:0)

  

在最后一行,我有画布绘制r1,成功和蓝色   绘制矩形。如果我用r替换r1,它只是白色。

r = new Rect(0,0,getWidth(),getHeight());

您可以在构造函数上执行此操作,因为此时getWidth()getHeight()返回0.您必须等到实际测量视图。在documenation上,您可以找到有关onMeasure回调

的更多信息