Java 自定义视图未动态显示在TableRow中
尝试动态创建Java 自定义视图未动态显示在TableRow中,java,android,android-relativelayout,android-framelayout,Java,Android,Android Relativelayout,Android Framelayout,尝试动态创建表格布局后,在表格行中膨胀我的一个布局时出现问题。文字视图按预期显示,具有正确的布局权重,但自定义视图(包含不同大小正方形的图形)没有。相反,我看到的是一个空白项,但布局权重正确BWSquares是我要充气的自定义视图 BWSquares.java public class BWSquares extends View { private final TextPaint mTextPaint; public static final int BOXES_COUNT
表格布局
后,在表格行
中膨胀我的一个布局时出现问题。文字视图按预期显示,具有正确的布局权重,但自定义视图(包含不同大小正方形的图形)没有。相反,我看到的是一个空白项,但布局权重正确BWSquares
是我要充气的自定义视图
BWSquares.java
public class BWSquares extends View {
private final TextPaint mTextPaint;
public static final int BOXES_COUNT = 7;
private float oneDp;
private float windowHeight;
public BWSquares(Context context) { this(context, null); }
public BWSquares(Context context, AttributeSet attrs) {
super(context, attrs);
oneDp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1,
getResources().getDisplayMetrics());
windowHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10,
getResources().getDisplayMetrics());
float textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 15,
getResources().getDisplayMetrics());
Paint mBlackPaint = new Paint();
mBlackPaint.setAntiAlias(true);
mBlackPaint.setColor(Color.BLACK);
mBlackPaint.setStrokeWidth(oneDp);
mBlackPaint.setStyle(Paint.Style.STROKE);
mTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG);
mTextPaint.setColor(Color.BLACK);
mTextPaint.setTextAlign(Paint.Align.CENTER);
mTextPaint.setTextSize(textSize);
}
private Paint mWindowPaint;
private Paint mWindowFilledPaint;
RectF rect = new RectF();
RectF rect2 = new RectF();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (getWidth() == 0) return;
float mSideRectWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());
setBackgroundColor(Color.parseColor("#808080"));
for (int i = 0; i < BOXES_COUNT; i++) {
float leftPosition = mSideRectWidth
+ i * oneDp
+ (getWidth() - mSideRectWidth * 2 - (BOXES_COUNT - 1) * oneDp) * i / BOXES_COUNT;
float rightPosition = mSideRectWidth
+ i * oneDp
+ (getWidth() - mSideRectWidth * 2 - (BOXES_COUNT - 1) * oneDp) * (i + 1)
/ BOXES_COUNT;
}
for (int i = 1; i < BOXES_COUNT; i++) {
float position = mSideRectWidth + (getWidth() - mSideRectWidth * 2) * i / BOXES_COUNT;
canvas.drawLine(position, 0, position, getHeight(), mGangwayConnectionPaint);
}
}
private void fillRect(Canvas canvas, float left, float right, String number) {
rect.set(left + oneDp / 2, 0 + oneDp / 2, right - oneDp / 2, getHeight() - oneDp / 2);
float xPos = left + ((right - left) / 2);
float yPos = (canvas.getHeight() / 2) - ((mTextPaint.descent() + mTextPaint.ascent()) / 2);
canvas.drawText(number, xPos, yPos, mTextPaint);
}
}
公共类视图{
私人最终文本绘制mTextPaint;
公共静态最终整数框_计数=7;
私人浮动oneDp;
私人浮动窗高度;
公共BWSquares(上下文){this(上下文,null);}
公共BWSquares(上下文、属性集属性){
超级(上下文,attrs);
oneDp=类型值。应用尺寸(类型值。复杂单位,1,
getResources().getDisplayMetrics());
窗高=类型值。应用尺寸(类型值。复杂单位,10,
getResources().getDisplayMetrics());
float textSize=TypedValue.applyDimension(TypedValue.COMPLEX\u UNIT\u SP,15,
getResources().getDisplayMetrics());
Paint mBlackPaint=新油漆();
mBlackPaint.setAntiAlias(真);
mBlackPaint.setColor(颜色:黑色);
mBlackPaint.设定行程宽度(oneDp);
mBlackPaint.setStyle(油漆.样式.笔划);
mTextPaint=新的TextPaint(TextPaint.ANTI_别名_标志);
mTextPaint.setColor(颜色为黑色);
mTextPaint.setTextAlign(Paint.Align.CENTER);
mTextPaint.setTextSize(textSize);
}
私人油漆;
私家漆(mWindowFilledPaint);
RectF rect=新的RectF();
RectF rect2=新的RectF();
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
如果(getWidth()==0)返回;
float mSideRectWidth=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,5,getResources().getDisplayMetrics());
setBackgroundColor(Color.parseColor(#808080”);
对于(int i=0;i
尝试将setWillNotDraw(false)
添加到构造函数中:
public BWSquares(Context context, AttributeSet attrs) {
super(context, attrs);
setWillNotDraw(false);
...
}
我发现了问题,框架布局不需要在那里。
public BWSquares(Context context, AttributeSet attrs) {
super(context, attrs);
setWillNotDraw(false);
...
}