自定义视图未在GridLayout中绘制

时间:2016-02-23 09:19:51

标签: android view ondraw

我有一个自定义视图,我正在尝试填充GridLayout。自定义视图由圆形内的TextView组成。我遇到的问题是我的自定义视图的onDraw()方法永远不会被调用,所以我总是以一个空白屏幕结束。当我使用常规TextViews填充我的GridLayout时,它工作正常,所以我猜测问题出在我的自定义视图的某处。

我的onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sample_collection);

    gl = (GridLayout) findViewById(R.id.grid_sample_collection);
    gl.setColumnCount(9);
    gl.setRowCount(9);
    LayoutInflater inflater = LayoutInflater.from(this);
    for(int i=0;i<gl.getRowCount();i++){
        for(int j=0;j<gl.getColumnCount();j++){
            SampleCollectionView sampleCollectionView = new SampleCollectionView(this);
            sampleCollectionView.setLabelText(i + "." + j);
            gl.addView(sampleCollectionView);

            //Adding the TextViews shown below works just fine
            //TextView t = new TextView(this);
            //t.setText(i + "." + j);
            //t.setTextSize(30f);
            //t.setPadding(30, 30, 30, 30);
            //gl.addView(t);
        }
    }
    int childCount = gl.getChildCount();
    for (int i= 0; i < childCount; i++){
        final SampleCollectionView sampleCollectionView = (SampleCollectionView) gl.getChildAt(i);
        //final TextView text = (TextView) gl.getChildAt(i);
        sampleCollectionView.setOnClickListener(new View.OnClickListener(){
            public void onClick(View view){
                Log.d("OnClickListener: ", "Clicked text: " + sampleCollectionView.getLabelText());
            }
        });
    } 
}

我的自定义视图:

public SampleCollectionView(Context context){
    super(context);
    init();
}

public SampleCollectionView(Context context, AttributeSet attrs) {
    super(context, attrs);

    //get the attributes specified in attrs.xml using the name we included
    TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
            R.styleable.SampleCollectionView, 0, 0);

    try {
        //get the text and colors specified using the names in attrs.xml
        circleText = a.getString(R.styleable.SampleCollectionView_circleLabel); //0 is default
        circleCol = a.getInteger(R.styleable.SampleCollectionView_circleColor, 0);
        circleBorderCol = a.getInteger(R.styleable.SampleCollectionView_circleBorderColor, 0);
        labelCol = a.getInteger(R.styleable.SampleCollectionView_labelColor, 0);
    } finally {
        a.recycle();
        init();
    }
}

public void init(){
    mPaint = new Paint();
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    int viewWidthHalf = this.getMeasuredWidth()/2;
    int viewHeightHalf = this.getMeasuredHeight()/2;

    int radius = 0;

    if(viewWidthHalf>viewHeightHalf)
        radius=viewHeightHalf-10;
    else
        radius=viewWidthHalf-10;

    mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaint.setAntiAlias(true);
    mPaint.setColor(circleCol);
    canvas.drawCircle(viewWidthHalf, viewHeightHalf, radius, mPaint);

    mPaint.setTextAlign(Paint.Align.CENTER);
    mPaint.setTextSize(20);

    canvas.drawText(circleText, viewWidthHalf, viewHeightHalf, mPaint);
}

编辑:经过一些测试后,我发现我的自定义视图的高度和重量都是0.使用setMinimumHeight和setMinimumWidth后,实际上它们正在被绘制并响应点击。现在唯一的问题是,出于某种原因,所有自定义视图都是完全不可见的......

编辑2:结果视图不可见,因为我没有正确设置像circleCol这样的View属性,这导致它们被设置为默认值(0)。

1 个答案:

答案 0 :(得分:0)

我设法弄清楚出了什么问题。我创建了自定义视图而没有指定高度/宽度。当然,这导致它们的高度和宽度为0,GridLayout获得与设置为wrap_content时相同的约束。

使用setMinimumHeight和setMinimumWidth方法为我的视图提供合适的高度和宽度后,我遇到了另一个问题:视图不可见。它们被绘制为onClickListener响应屏幕各个部分的点击但我无法看到它们。造成这种情况的原因与高度和宽度为0的原因相同:自定义View的颜色属性未正确设置。我试图通过XML来做这件事,但由于某种原因,它无法检索我在XML文件中指定的属性的值。由于未指定属性,因此它们恢复为默认值,导致未指定颜色且未向标签提供字符串。我通过以编程方式设置属性来修复此问题。