0

実用的にレイアウトに追加する単純なカスタム ビューがあります。ビューは描画されません。と の値は、高さがないため、ビューが描画されていないことを示していますonMeasureonLayoutレイアウト パラメータの定数を使用してビューを適用しようとしましたが、問題は解決しませんでした。レイアウト パラメータのさまざまな組み合わせを設定しonMeasureonDraw, , をオーバーライドして、設定を false に設定しようとしましたが、何も機能しないようです。 onLayoutsetMeasuredDimensionsetWillNotDraw

このビューがアタッチされているレイアウトは、コンテンツをラップするように設定されており、アダプターで作成されています。ソースコードを掲載しました。

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);          
    }           
}

AndroidView システムがどのように機能するかを段階的に詳しく説明し、これらの問題を回避する方法を説明している優れたリソースを誰かが知っている場合。大変ありがたく存じます。

ありがとうございました、

4

1 に答える 1

0
  1. setMeasuredDimension を呼び出す場合、 super.onMeasure を呼び出すべきではありません。これは、デフォルトの測定値を呼び出すためです。
  2. onMeasure メソッド内で、後で onDraw によって使用されるように、ビューの幅と高さを必ず保存してください。
  3. ビューを含むビューがそのレイアウト パラメータを「見る」前に、ビューの幅と高さを取得することは不可能です。これらのコンテナは、周囲に基づいて与えるサイズを決定する必要があるためです。
  4. onLayout - 「このビューがそのすべての子にサイズと位置を割り当てる必要があるときに呼び出されます。」これは、他のビュー (ViewGroup) を含むビューのみを対象としていることを意味します。

詳細については、次のリンクを参照してください。

http://developer.android.com/guide/topics/ui/custom-components.html

http://developer.android.com/guide/topics/ui/how-android-draws.html

于 2012-05-19T12:11:10.350 に答える