我想通过按一个按钮来更改MyView的大小。

MyView的初始大小是400 * 400,每当我按下按钮b1时,w就会增加100。我认为视图大小应该更改,但是仍然是400 *400。但是,如果更改b2ClickListener的大小都会更改b2中的按钮MyView(添加行a和行b)。我不知道怎么回事。如果我只想动态更改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;
}


}

最佳答案

我注意到了几件奇怪的事情

1)//MyView.this.invalidate()被注释掉。更改布局时,需要调用invalidate()revalidate()

2)我不确定您为什么使用MyView.this-尝试仅使用this。我唯一见过Classname的地方。这是当您进入内部类并且需要进入外部类时(请参见this)。 MyView不是内部类。

3)//super.onDraw(canvas)被注释掉。使用Java绘图/绘画替代,您几乎总是想调用super来确保子容器和父容器也收到要重绘的消息。

10-07 19:30
查看更多