我有一个覆盖onMeasure的自定义视图。
我看到onMeasure()
两次被调用,第一次是heightMeasureSpec为0x7fffffff-似乎不是有效的MeasureSpec值。
然后,它再次被调用,此时具有正确的值。
以下是基本组成部分,分为相关部分:
自定义视图:
public class CustomView extends ViewGroup implements SurfaceHolder.Callback {
public CustomView(Context context, AttributeSet as) {
super(context, as);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.custom_view, this, true);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
}
}
布局(同样,将其精简以使其尽可能简短):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
这是包含它的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<CustomView
android:id="@+id/custom_view"
android:layout_width="@dimen/custom_size"
android:layout_height="@dimen/custom_size"
/>
</RelativeLayout>
</ScrollView>
</LinearLayout>
这里的主要观察结果:
在这种情况下,我首先使用0x40000100、0x7fffffff调用onMeasure,然后再次使用0x40000100、0x40000100调用,这是我最初期望的。
也许首先用无效的高度调用onMeasure是完全正常的吗?我可以忽略它,但是我不想在这里添加任何hack。
解答:这是已修复的操作系统中的错误,在此处记录:
在平台版本17和更低版本中,RelativeLayout受到测量错误的影响,该测量错误可能导致使用错误的MeasureSpec值来测量子视图。(有关更多详细信息,请参见MeasureSpec.makeMeasureSpec。)将RelativeLayout容器放置在滚动容器(例如ScrollView或HorizontalScrollView)中时触发。如果将不适合使用MeasureSpec模式进行适当测量的自定义视图放置在RelativeLayout中,则无论如何它都将无声工作,因为RelativeLayout会通过一个非常大的AT_MOST MeasureSpec。
我不会将其发布为答案,Snicolas足够好看这个,所以他值得他接受。
我使用了这个小的IDE。而且,正如您所看到的,您收到的两个值都处于精确模式下。如果我们遵循onMeasure
在StackOverFlow上最喜欢的引用实现,它们都朝着相同的方向发展:
除了将它们传递给,您无需执行其他任何操作setMeasureDimensions
。仅当接收到的度量未处于精确模式时,您才可以修改它们。
我想念什么吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句