我正在构建一个自定义复合控件。此复合控件的组件之一是自定义按钮。我的 ShiftingTabButton 是我的复合控件类中的一个嵌套类。
我需要将 ShiftingTabButton 的 clipBounds 设置为比第一次绘制时的实际高度略短。
在下面显示的 ShiftingTabButton 的构造函数中,我设置了一些必要的参数,然后measure()
使用 mode调用UNSPECIFIED
,以确定新视图的预期大小。当我在调试模式下运行它时,我的 Nexus 7 可以看到width
= 160 和height
= 64。
到目前为止一切都很好。
但是,当我尝试使用修改后的 clipBounds 调用 setClipBounds() 时,应用程序崩溃了。
我尝试useShorterClipBounds
在构造函数中定义一个标志,将设置移动clipBounds
到onDraw()
方法并使其依赖于标志检查,但我仍然遇到同样的崩溃。
public ShiftingTabButton(Context context, String string) {
super(context);
// parameter setup
this.setText(string);
this.setBackground(getResources().getDrawable(R.drawable.tab_unselected));
this.setId(generateChildViewId());
this.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
this.setPadding(dpToPx(7), 0, dpToPx(7), 0);
// measure the view
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED);
this.measure(widthMeasureSpec, heightMeasureSpec);
int width = this.getMeasuredWidth();
int height = this.getMeasuredHeight();
// adjust the clipBounds
Rect clipBounds = new Rect();
clipBounds.set(0, 0, width, height - dpToPx(16));
this.setClipBounds(clipBounds); // !App crashes executing this line of code!
}