无法以编程方式将视图参数设置为WRAP_CONTENT

时间:2015-05-20 18:49:26

标签: android view

我正在尝试以编程方式在height和width中设置自定义视图到wrap_content。问题在于,无论我做什么,它总是呈现为match_parent。

这是视图

public class Circle extends View
{
public Circle(Context context) {
    super(context);
}

public Circle(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public Circle(Context context, AttributeSet attrs) {
    super(context, attrs);
}

protected void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    Paint paint = new Paint();
    paint.setColor(0xffff0000);
    canvas.drawCircle(mmToPx(4), mmToPx(4), mmToPx(4), paint);
}

public float mmToPx(int mm) {
    DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics();
    return mm * displayMetrics.xdpi * (1.0f/25.4f);
}

这是主要代码

public void addCircle()
{
    Circle circle = new Circle(this);

    Random r = new Random();
    FrameLayout.LayoutParams cParams = new FrameLayout.LayoutParams(-1, -2);
    cParams.setMargins(r.nextInt((int) (w - (mmToPx(diam)))), r.nextInt((int) (h - (mmToPx(diam)))), 0, 0);
    circle.setLayoutParams(cParams);
    circle.setBackgroundColor(0xff00ff00);
    Log.v("sd", circle.getLayoutParams().width + "");
    circle.setId(R.id.circle);
    circle.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            count++; scoreTv.setText("Score:\n"+count);
            frame.removeView(findViewById(R.id.circle));
            addCircle();
        }
    });
    frame.addView(circle);
}

感谢您的帮助:)

2 个答案:

答案 0 :(得分:0)

首先 - 永远不要使用像-2这样的幻数。使用ViewGroup.LayoutParams.WRAP_CONTENT。否则,您的代码将变得难以阅读并且可能包含错误(例如,如果他们更改了值)。

其次 - 你实际上并没有在任何地方使用cParams。您想使用带有视图和布局参数的addView版本。否则,如何在该视图中使用那些布局参数。

第三,您的视图中没有onMeasure功能。如果没有它,它将如何知道您的视图有多大,以便它实际上可以在其上包装内容?您需要定义onMeasure,以便它可以获得视图的宽度和高度。

答案 1 :(得分:0)

try this:
view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT))