我有一个MyLayout
课程RelativeLayout
,其中包含View
类型字段。 {x}布局文件中创建了MyLayout
对象,因此在那里设置了所有属性。我需要以编程方式设置View
字段的大小,这取决于它的父级(MyLayout
)的大小。
我试图在构造函数中设置它,但是当我尝试使用getWidth()
方法时,它返回0,所以我假设在构造函数中尚未设置大小。我也试图在onDraw()
方法中设置它,但是当我运行一个应用程序时,这个内部View
显示为第二个,它的默认大小,在那之后它被缩放到正确的大小。然后我尝试将它放在onMeasure()
方法中,但是这个方法被调用了几次,所以它再次看起来效率不高。
那么设置它的最佳位置是什么?
这是我的班级:
public class MyLayout extends RelativeLayout {
private View pointer;
public MyLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public MyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public MyLayout(Context context) {
super(context);
init(context);
}
private void init(Context c) {
pointer = new View(c);
pointer.setBackgroundResource(R.drawable.pointer);
addView(pointer);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();
lp.height = (int)(getHeight() * 0.198);
lp.width = (int)(getWidth() * 0.198);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
答案 0 :(得分:1)
在MyLayout类中,覆盖onSizeChanged():
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();
lp.height = (int)(getHeight() * 0.198);
lp.width = (int)(getWidth() * 0.198);
};