自定义视图未在 GridLayout 中绘制

Custom view not getting drawn in GridLayout

我有一个自定义视图,我正在尝试用它填充 GridLayout。自定义视图由圆圈内的 TextView 组成。我遇到的问题是我的自定义视图的 onDraw() 方法永远不会被调用,所以我总是以空白屏幕结束。当我仅使用常规 TextView 填充我的 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 等属性,这导致它们被设置为默认值 (0)。

我设法弄清楚出了什么问题。我在未指定 height/width 的情况下创建了自定义视图。自然地,这导致它们的高度和宽度为 0,GridLayout 获得与设置为 wrap_content 相同的约束。

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