我有一个自定义视图会覆盖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是否完全正常?我可以忽略它,但我不想在这里添加任何黑客。
答案:操作系统中的一个错误已修复,记录在案here:
在平台版本17及更低版本中,RelativeLayout受到a的影响 可能导致子视图被测量的测量错误 MeasureSpec值不正确。 (参见MeasureSpec.makeMeasureSpec for 更多细节。)这是在RelativeLayout容器时触发的 放置在滚动容器中,例如ScrollView或 HorizontalScrollView。如果自定义视图未正确配备 使用MeasureSpec模式测量的被放置在一个 RelativeLayout,无论如何都会默默地作为RelativeLayout工作 会传递一个非常大的AT_MOST MeasureSpec。
我不会发布这个作为答案,Snicolas已经很好看了这个,所以他应得到他接受的答案。
答案 0 :(得分:2)
我使用了这个小IDE one gist。而且,正如您所看到的,您收到的两个值都处于完全模式。如果我们遵循StackOverFlow最受欢迎的onMeasure
的引用实现,它们都朝着同一个方向:
除了将它们传递给setMeasureDimensions
之外,您无需做任何其他事情。您只能在不完全处于模式的情况下修改收到的措施。
我错过了什么吗?