无法以编程方式将视图参数设置为 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))
我正在尝试以编程方式将自定义视图的高度和宽度设置为 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))