public class ViewgroupActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);  
        myviewgroup my= new myviewgroup(this);
         setContentView(my);
         MyView myview;
    }
}
class  myviewgroup extends ViewGroup
{
 MyView myview;
public myviewgroup(Context context)
{
super(context);
this.initOtherComponent(context);
}
public void initOtherComponent(Context context)
{
   Button aBtn = new Button(context);  //定义了一个按钮
        aBtn.setId(1);  
        aBtn.setText("a btn");  
        this.addView(aBtn); 
        
         myview=new MyView(context);//定义了一个自定义的view
        myview.setId(3);
       this.addView(myview);
    
}
@Override  
    protected void onLayout(boolean changed, int l, int t, int r, int b) 
{
int childCount = getChildCount();  
        for (int i = 0; i < childCount; i++) {  
            View child = getChildAt(i);  
            switch (child.getId()) {  
            case 1:   
                Log.d("MyViewGroup", "btn1 setting");  
                child.setVisibility(View.VISIBLE);  
                child.measure(r - l, b - t);  
                child.layout(0, 0, child.getMeasuredWidth(), child  
                        .getMeasuredHeight());  
                break;  
            case 3:  
                Log.d("MyViewGroup", "myview");  
                child.setVisibility(View.VISIBLE);  
                child.measure(r - l, b - t);  
                child.layout(0, 100, child.getMeasuredWidth(),child.getMeasuredHeight() + 100); //显示不出来myview
                break;  
            }  
        }  
}
}
//自定义的view
class MyView extends View
{

public MyView(Context context)
{

super(context);
System.out.println("myview ffff    fist");

}

protected void onDraw(Canvas canvas)
{
Paint paint=new Paint();
paint.setColor(Color.RED);
paint.setStyle(Style.FILL_AND_STROKE);
Rect rect=new Rect(40,10,240,410);
Rect rectbox;
canvas.drawRect(rect, paint);
System.out.println("myview     fist");

      }

}
为什么自定义的myview显示不出来,而button显示出来了,在显示myview时,什么时候调用ondraw()函数,谢谢各位了

解决方案 »

  1.   

    你在增加view的时候加一个layoutparamsaddview(view ,param)给它加一个布局参数试一下、
      

  2.   

    case 3:
                                    Log.d("MyViewGroup", "myview"); 
    child.setVisibility(View.VISIBLE);
    child.measure(r - l, b - t);
    System.out.println("~~~~~~~~~~~~3~~~~~~"+child.getMeasuredWidth());
    System.out.println("~~~~~~~~~~~~3~~~~~~"+child.getMeasuredHeight());看看 这2个log 就知道为什么不显示了
      

  3.   

    为什么不调用view的ondraw()函数?是不是因为没有调用ondraw()函数,所以
    Log.d("MyViewGroup", "myview"); 
    child.setVisibility(View.VISIBLE);
    child.measure(r - l, b - t);
    System.out.println("~~~~~~~~~~~~3~~~~~~"+child.getMeasuredWidth());
    System.out.println("~~~~~~~~~~~~3~~~~~~"+child.getMeasuredHeight());这才输出0吧
      

  4.   

    onmeasure
    onlayout
    ondraw你还得再看
      

  5.   

    如果把class myviewgroup extends ViewGroup的继承改为class myviewgroup extends linearlayout就可以了,为什么,mygroup不也是view的容器吗
      

  6.   

    恩,谢了,知道了。必须重写onmeasure()函数在里面调用函数setMeasuredDimension(widthMeasureSpec,heightMeasureSpec);才可以。
    这么说linearlayout是viewgroup的派生类,所以已经重写了onmeasure()是吧。。
    问一下random.nextInt() >>> 1是什么意思,random.nextInt() 是产生随机数,但>>> 1是什么意思,谢了。