自定义ViewGroup中不能正确显示 其它的viewGroup

yuanzi 2011-05-24 11:49:35
问题描述:

小弟写了一个MyViewGroup(extends ViewGroup),在MyViewGroup中可以正确显示child view都是widget类型的(例如Button,ImageButton),但不能正确显示其它的ViewGroup比如系统的RelativeLayout。我在xml中RelativeLayout里面只定义了一个ImageButton ,这个ImageButton能够显示出来但显示的位置与xml中定义的不同。

测试类 testViewClass.java :


package com.yht.testViewClass;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.RelativeLayout;

public class testViewClass extends Activity {
/** Called when the activity is first created. */
MyViewGroup mvg;
LayoutInflater layoutInflater;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


mvg = new MyViewGroup(this);
this.setContentView(mvg);
layoutInflater = this.getLayoutInflater();
RelativeLayout view = (RelativeLayout) layoutInflater.inflate(R.layout.mute_box, null);
mvg.addView(view);

}
}



MyViewGroup.java


package com.yht.testViewClass;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.MeasureSpec;
import android.widget.LinearLayout;

public class MyViewGroup extends ViewGroup {

public MyViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);

}

public MyViewGroup(Context context) {
super(context);

}
@Override
protected void onLayout(boolean arg0, int l, int t, int r, int b) {

int count = this.getChildCount();

for(int i = 0;i < count;i++){
View child = this.getChildAt(i);
child.setVisibility(View.VISIBLE);
child.measure(r-l, b-t);
int x = l;
int y = t;
//心中疑惑:我认为我只要在这里调用child的layout(int,int,int,int)方法给出它的位置和宽高就可以了
//如果child本身是一个ViewGroup的话它是否应该自己去管理它本身内部的child的位置和宽度呢???
child.layout(x,y,x + getWidth(),y + getHeight());
}
}

}


相对布局的xml文件 mute_box.xml:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:background="@drawable/list_background">

<!--
Button 相对于Parent 垂直靠右显示
-->
<Button
android:id="@+id/image_button_2"
android:text="TEST BUTTON"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5px"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
/>



</RelativeLayout>


...全文
1027 点赞 收藏 7
写回复
7 条回复
zyq 2014年02月12日
调用 ViewGroup.addView(View child, ViewGroup.LayoutParams params) 就可以了。后面要添加LayoutParams 参数。( LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);)ViewGroup嵌套其它布局时子view的宽度和高度默认为wrap_content。  mvg.addView(view,new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
回复 点赞
俏鹏 2014年01月03日
我在ViewGroup下边放置一个TextView设置文本框中文字的对齐方式不管用···
回复 点赞
winson_jason 2012年11月19日
我也遇到这样的问题!
回复 点赞
Marco_Lee 2012年10月29日
//心中疑惑:我认为我只要在这里调用child的layout(int,int,int,int)方法给出它的位置和宽高就可以了
//如果child本身是一个ViewGroup的话它是否应该自己去管理它本身内部的child的位置和宽度呢???


同样疑惑。。。求高手解答。。遇到同样问题了~~~
回复 点赞
sandshowboy 2011年12月06日
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int count = getChildCount();
for (int i = 0; i < count; i++) {
getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
}
}
填上这个就可以了
回复 点赞
avi9111 2011年07月12日
我也碰到这个问题啊,只能显示VIEW
回复 点赞
changy 2011年05月24日
关注,帮顶
回复 点赞
发动态
发帖子
Android
创建于2009-10-09

4.6w+

社区成员

9.0w+

社区内容

移动平台 Android
社区公告
暂无公告