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

Can't set view params to WRAP_CONTENT programatically

我正在尝试以编程方式将自定义视图的高度和宽度设置为 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 这样的幻数。使用 ViewGroup.LayoutParams.WRAP_CONTENT。否则您的代码将变得难以阅读并且可能包含错误(例如,如果他们更改了值)。

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

第三,您的视图中没有 onMeasure 函数。如果没有它,它怎么知道你的视图有多大,以便它可以实际将内容包装在上面?您需要定义 onMeasure 以便它可以获取视图的宽度和高度。

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