自定义视图未在 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 文件中指定的属性值。由于未指定属性,它们恢复为默认值,这导致未指定颜色且未向标签提供字符串。我通过以编程方式设置属性来修复此问题。
我有一个自定义视图,我正在尝试用它填充 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 文件中指定的属性值。由于未指定属性,它们恢复为默认值,这导致未指定颜色且未向标签提供字符串。我通过以编程方式设置属性来修复此问题。