Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义视图不是图形,视图8为零,即使添加了具有常量值的布局参数_Android_Android Layout_View_Drawing - Fatal编程技术网

Android 自定义视图不是图形,视图8为零,即使添加了具有常量值的布局参数

Android 自定义视图不是图形,视图8为零,即使添加了具有常量值的布局参数,android,android-layout,view,drawing,Android,Android Layout,View,Drawing,我有一个简单的自定义视图,我正在务实地添加到布局中。视图没有绘制。来自测量上的和仅布局上的值表明视图没有绘制,因为它没有高度。我尝试为布局参数应用带有常量的视图,但这并没有解决问题。我尝试设置不同的布局参数组合,覆盖测量上的,onDraw,onLayout,设置setMeasuredDimension,将setWillNotDraw设置为false,但似乎没有任何效果 此视图所附着的布局已设置为“包装内容”,并在适配器中创建。我已经发布了我的源代码 private void addGuessNu

我有一个简单的自定义视图,我正在务实地添加到布局中。视图没有绘制。来自测量上的
仅布局上的值表明视图没有绘制,因为它没有高度。我尝试为布局参数应用带有常量的视图,但这并没有解决问题。我尝试设置不同的布局参数组合,覆盖测量上的
onDraw
onLayout
,设置
setMeasuredDimension
,将
setWillNotDraw
设置为false,但似乎没有任何效果

此视图所附着的布局已设置为“包装内容”,并在适配器中创建。我已经发布了我的源代码

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);          
    }           
}
private void addGuess数字(行持有者行){
LinearLayout.LayoutParams numeric_view_params=新的LinearLayout.LayoutParams(100100);
数词视图数词视图=新数词视图(上下文);
数字视图。setLayoutParams(数字视图参数);
Log.d(“mygamesdapter”、“row.game.getguesss.length=“+row.game.getguesss().length”);
numeric_view.setCount(row.game.getguesss().length);
行.布局\数字.添加视图(数字\视图);
}
公共类视图扩展了视图{
专用静态最终int BAR_间距=5;
专用静态最终整型条_宽度=5;
专用静态最终整流罩高度=15;
私有静态最终整数填充=5;
私有静态最终字符串标记=“数字视图”;
私人整数计数;
私人油漆;
私有整数宽度;
私人内部高度;
公共数字视图(上下文){
超级(上下文);
油漆=新油漆(油漆.防油漆别名标志);
绘制.设置样式(绘制.样式.填充和笔划);
油漆。设置颜色(颜色。黑色);
油漆。设置行程宽度(条形宽度);
setWillNotDraw(假);
}
公共无效集合计数(整数计数){
this.count=计数;
//此.setLayoutParams(新的LayoutParams((填充*2)+(计数*(条形间距+条形宽度)),
//横杆高度+(填充*2));
}
@凌驾
受保护的void onDraw(画布){
canvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);
for(int i=0;i
如果有人知道一个好的资源,可以深入了解
Android
查看系统的工作原理,一步一步地解释如何避免这些问题;我将非常感激

谢谢,

  • 如果调用setMeasuredDimension,则不应调用super.onMeasure,因为这将调用默认测量
  • 在onMeasure方法中,确保保存视图的宽度和高度,以供onDraw稍后使用
  • 在包含视图的视图“查看”其布局参数之前获取视图的宽度和高度是不可能的,因为这些容器需要根据其周围环境来决定为其指定的大小
  • -“当此视图应为其所有子视图指定大小和位置时调用。”这意味着它仅适用于包含其他视图(ViewGroup)的视图
  • 有关更多信息,请参见下一个链接:


    谢谢!我会做出改变并让你知道。我还注意到,在将容器添加到容器之前,我正在添加contianer的子级。这也可能是问题的原因吗?顺序不重要。但是,为了获得视图的大小,您必须在布局完成后进行,而不是在您仍在组装时进行。我不太确定我是否理解。你把东西放在一起是什么意思?我如何证明布局已经完成?您可以使用我给出的解决方案在布局阶段之后,但在绘制视图之前获取视图的大小:。“把事情放在一起”——我指的是通常在onCreate方法上进行的全部初始化。它们除了为视图存储内容之外什么都不做,只是后来它们才真正进行布局计算