実用的にレイアウトに追加する単純なカスタム ビューがあります。ビューは描画されません。と の値は、高さがないため、ビューが描画されていないことを示していますonMeasure
。onLayout
レイアウト パラメータの定数を使用してビューを適用しようとしましたが、問題は解決しませんでした。レイアウト パラメータのさまざまな組み合わせを設定しonMeasure
、onDraw
, , をオーバーライドして、設定を false に設定しようとしましたが、何も機能しないようです。 onLayout
setMeasuredDimension
setWillNotDraw
このビューがアタッチされているレイアウトは、コンテンツをラップするように設定されており、アダプターで作成されています。ソースコードを掲載しました。
private void addGuessNumeral(RowHolder row) {
LinearLayout.LayoutParams numeral_view_params = new LinearLayout.LayoutParams(100, 100);
NumeralView numeral_view = new NumeralView(context);
numeral_view.setLayoutParams(numeral_view_params);
Log.d("MyGamesAdapter", "row.game.getGuesses.length = " + row.game.getGuesses().length);
numeral_view.setCount(row.game.getGuesses().length);
row.layout_numeral.addView(numeral_view);
}
public class NumeralView extends View {
private static final int BAR_SPACING = 5;
private static final int BAR_WIDTH = 5;
private static final int BAR_HEIGHT = 15;
private static final int PADDING = 5;
private static final String TAG = "NumeralView";
private int count;
private Paint paint;
private int width;
private int height;
public NumeralView(Context context) {
super(context);
paint = new Paint (Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setColor(Color.BLACK);
paint.setStrokeWidth(BAR_WIDTH);
setWillNotDraw(false);
}
public void setCount(int count) {
this.count = count;
// this.setLayoutParams(new LayoutParams((PADDING*2) + (count * (BAR_SPACING + BAR_WIDTH)),
// BAR_HEIGHT + (PADDING*2)));
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
for(int i = 0; i < count; i++) {
//algorithm: each bar will occupy on tenth of the width. Bars are spaced with one tenth of the width apart
canvas.drawLine(i * (BAR_SPACING + BAR_WIDTH), 0, i * (BAR_SPACING + BAR_WIDTH) + BAR_WIDTH, height, paint);
if (i%5 == 0) {
canvas.drawLine(0, 0, width, height, paint);
}
}
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
Log.d("NumeralView", "left = " + left);
Log.d("NumeralView", "top = " + top);
Log.d("NumeralView", "right = " + right);
Log.d("NumeralView", "bottom = " + bottom);
height = bottom - top;
width = right - left;
Log.d("NumeralView", "height = " + height);
Log.d("NumeralView", "width = " + width);
super.onLayout(changed, left, top, right, bottom);
}
/* (non-Javadoc)
* @see android.view.View#onMeasure(int, int)
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
widthMeasureSpec = MeasureSpec.makeMeasureSpec(widthMeasureSpec, MeasureSpec.AT_MOST);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(heightMeasureSpec, MeasureSpec.AT_MOST);
Log.d("NumeralView", "widthMeasureSpec = " + widthMeasureSpec);
Log.d("NumeralView", "heightMeasureSpec = " + heightMeasureSpec);
setMeasuredDimension(heightMeasureSpec, heightMeasureSpec);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/* (non-Javadoc)
* @see android.view.View#onSizeChanged(int, int, int, int)
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
}
Android
View システムがどのように機能するかを段階的に詳しく説明し、これらの問題を回避する方法を説明している優れたリソースを誰かが知っている場合。大変ありがたく存じます。
ありがとうございました、