度量的自定义视图未按预期工作
Custom view on measure not working as expected
我正在创建一个自定义的 TextView
可以像这样在两端绘制文本,并且它支持多行,这样文本视图的数量可以减少一半(我收到了 lint 警告,抱怨 80 多个视图,大部分视图都是我布局中的 TextView,例如在网格布局中添加的名字、姓氏)
请看屏幕截图,这是视图的当前状态
它会在固定高度时显示文本,我不希望出现这种情况,因为右侧的文本可以是任意长度,它应该将高度换行到所需的高度。这是重写的 onMeasure
方法
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mRightText == null) return;
initStaticLayout();
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mLayout.getHeight());
}
mLayout
是一个 StaticLayout
private void initStaticLayout() {
if (mLayout == null) {
mLayout = new StaticLayout(mRightText, mPaint,
getWidth() / 2 - getPaddingRight() - getPaddingLeft(),
Layout.Alignment.ALIGN_NORMAL,
1, 0, true);
}
}
如果高度设置为 wrap_content
,则不会绘制任何内容。
而不是在 xmlfile 中,为什么不能创建两个将 layout_weight 保持为 1 的文本视图。
这样整个屏幕就会被分成两个相等的分区。
当我在模拟器中尝试视图时,activity 一启动就出现了这个异常,
java.lang.IllegalArgumentException: Layout: -xx < 0
也就是initStaticLayout
的宽度
mLayout = new StaticLayout(mRightText, mPaint,
/*the error was here*/ getWidth() / 2 - getPaddingRight() - getPaddingLeft(),
Layout.Alignment.ALIGN_NORMAL,
1, 0, true);
我将它从 getWidth()
更改为 screenWidth
现在我可以包裹高度,无论正确的文本有多大。我不知道为什么修复宽度问题修复了高度问题,可能是因为异常,布局无法生成预览。
感谢@pskink 的 adb 提示,感谢大家
我正在创建一个自定义的 TextView
可以像这样在两端绘制文本,并且它支持多行,这样文本视图的数量可以减少一半(我收到了 lint 警告,抱怨 80 多个视图,大部分视图都是我布局中的 TextView,例如在网格布局中添加的名字、姓氏)
请看屏幕截图,这是视图的当前状态
它会在固定高度时显示文本,我不希望出现这种情况,因为右侧的文本可以是任意长度,它应该将高度换行到所需的高度。这是重写的 onMeasure
方法
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mRightText == null) return;
initStaticLayout();
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mLayout.getHeight());
}
mLayout
是一个 StaticLayout
private void initStaticLayout() {
if (mLayout == null) {
mLayout = new StaticLayout(mRightText, mPaint,
getWidth() / 2 - getPaddingRight() - getPaddingLeft(),
Layout.Alignment.ALIGN_NORMAL,
1, 0, true);
}
}
如果高度设置为 wrap_content
,则不会绘制任何内容。
而不是在 xmlfile 中,为什么不能创建两个将 layout_weight 保持为 1 的文本视图。 这样整个屏幕就会被分成两个相等的分区。
当我在模拟器中尝试视图时,activity 一启动就出现了这个异常,
java.lang.IllegalArgumentException: Layout: -xx < 0
也就是initStaticLayout
的宽度
mLayout = new StaticLayout(mRightText, mPaint,
/*the error was here*/ getWidth() / 2 - getPaddingRight() - getPaddingLeft(),
Layout.Alignment.ALIGN_NORMAL,
1, 0, true);
我将它从 getWidth()
更改为 screenWidth
现在我可以包裹高度,无论正确的文本有多大。我不知道为什么修复宽度问题修复了高度问题,可能是因为异常,布局无法生成预览。
感谢@pskink 的 adb 提示,感谢大家