我有一个自定义视图,我正在尝试填充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)。
答案 0 :(得分:0)
我设法弄清楚出了什么问题。我创建了自定义视图而没有指定高度/宽度。当然,这导致它们的高度和宽度为0,GridLayout获得与设置为wrap_content时相同的约束。
使用setMinimumHeight和setMinimumWidth方法为我的视图提供合适的高度和宽度后,我遇到了另一个问题:视图不可见。它们被绘制为onClickListener响应屏幕各个部分的点击但我无法看到它们。造成这种情况的原因与高度和宽度为0的原因相同:自定义View的颜色属性未正确设置。我试图通过XML来做这件事,但由于某种原因,它无法检索我在XML文件中指定的属性的值。由于未指定属性,因此它们恢复为默认值,导致未指定颜色且未向标签提供字符串。我通过以编程方式设置属性来修复此问题。