填充在android中无法正常工作

时间:2013-05-06 06:34:16

标签: android android-layout

填充在自定义ViewGroup中无法正常工作

您好:

我的布局有以下结构:

RelativeLayout(with padding)    
    MainView(ViewGroup)

activety_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    tools:context=".MainActivity" >

    <com.example.testandroid.MainView 
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

的MainView:

public class MainView extends ViewGroup {
    public MainView(Context context, AttributeSet as) {
        super(context);
        addView(new MyView(context, null));
    } 

    @Override
    protected void dispatchDraw(Canvas canvas) {
        canvas.drawColor(Color.GREEN);
        super.dispatchDraw(canvas);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        for (int i = 0, len = getChildCount(); i < len; i++) {
            View v = getChildAt(i);
            v.layout(l,t,r,b);
        }
    }
}

MyView的:

public class MyView extends SurfaceView implements Callback {
    public MyView(Context contex, AttributeSet as) {
        super(contex, as);
        getHolder().addCallback(this);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        refresh();
    }

    private void refresh() {
        SurfaceHolder holder = getHolder();
        synchronized (holder) {
            Canvas canvas = holder.lockCanvas();
            if (canvas != null) {
                try {
                    Paint p = new Paint();
                    p.setColor(Color.RED);
                    canvas.drawCircle(10, 10, 10, p);
                } finally {
                    holder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        refresh();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
}

现在,这就是我现在所拥有的:

enter image description here

如您所见,我创建的视图组MainView的背景为greenMainView动态添加MyView,背景为黑色。

现在,问题是MyView相对于MainView的填充是什么?因为我希望占用MainView的所有空格,也就是说greed应该是不可见的。

为什么呢? 但是

2 个答案:

答案 0 :(得分:1)

布置孩子时,需要相对于你的位置。

为了填补你自己,你会做child.layout(0, 0, getWidth(), getHeight());

答案 1 :(得分:-1)

尝试这样做......

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"


tools:context=".MainActivity" >

<com.example.testandroid.MainView
    android:layout_width="match_parent"
    android:layout_height="600dp"
 />

</RelativeLayout>