我想通过按一下按钮更改MyView
的大小。
MyView
的初始大小为400 * 400,每次按下按钮b1
,w
都会增加100.我认为视图大小应该更改,但它仍然是400 * 400 。但是,如果我更改b2
中按钮ClickListener
的大小,(添加第a行和第b行),b2
和MyView
的大小都会改变大小。我不知道这是怎么回事。如果我只想动态更改MyView
的大小,我该怎么办?
相关代码:
public class MyView extends RelativeLayout {
Button b1;
Button b2;
Context sContext;
public static int i = 0;
private int w = 400;
private int h = 400;
private int w2 = 100;
private int h2 = 100;
public MyView(Context context) {
super(context);
sContext = context;
init();
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
sContext = context;
init();
}
private void init() {
b1 = new Button(sContext);
b2 = new Button(sContext);
addView(b1);
addView(b2);
b1.setBackgroundColor(Color.YELLOW);
b2.setX(500);
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (MyView.this.getLayoutParams() == null) {
MyView.this.setLayoutParams(new FrameLayout.LayoutParams(w, h));
} else {
MyView.this.getLayoutParams().width = w;
MyView.this.getLayoutParams().height = h;
}
MyView.this.setBackgroundColor(Color.GREEN);
//b2.setWidth(w2); line a
//b2.setHeight(h2); line b
//MyView.this.invalidate();
w += 100;
w2 += 20;
}
});
}
@Override
protected void onDraw(Canvas canvas) {
//super.onDraw(canvas);
test();
}
private void test() {
b2.setBackgroundColor(Color.BLUE);
b2.setX(200.0f);
Toast.makeText(sContext, ""+i, Toast.LENGTH_SHORT).show();
++i;
}
}
答案 0 :(得分:0)
我发现了几件奇怪的事情
1)//MyView.this.invalidate()
被注释掉了。更改布局时,您需要调用invalidate()
或revalidate()
。
2)我不确定您使用MyView.this
的原因 - 尝试仅使用this
。我唯一一次见过Classname.this就是当你在一个内部类中并且需要到达外部类时(参见this)。 MyView不是内部类。
3)//super.onDraw(canvas)
被注释掉了。使用java绘图/绘制覆盖,你几乎总是想调用super来确保子容器和父容器也能重新绘制消息。
答案 1 :(得分:0)
尝试以下代码
private void init() {
b1 = new Button(sContext);
b2 = new Button(sContext);
addView(b1);
addView(b2);
b1.setBackgroundColor(Color.YELLOW);
b2.setX(500);
LayoutParams lp =getLayoutParams();
if(lp==null){
lp=new LayoutParams(w,h);
setLayoutParams(lp);
}
lp.height=h;
lp.width=w;
requestLayout();
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyView.this.setBackgroundColor(Color.GREEN);
w += 100;
getLayoutParams().width=w;
requestLayout();
}
});
}