onMeasure()使用0x7fffffff调用heightMeasureSpec

时间:2013-11-17 06:08:19

标签: android android-layout

我有一个自定义视图会覆盖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>

这里的主要观察结果:

  • 自定义视图具有固定的宽度和高度(自定义大小为128dp)。
  • 视图本身位于RelativeLayout内。
  • 所有这些都在ScrollView中。

在这种情况下,我首先使用0x40000100,0x7fffffff调用onMeasure,然后再调用0x40000100,0x40000100,这是我首先想到的。

首先使用无效高度调用onMeasure是否完全正常?我可以忽略它,但我不想在这里添加任何黑客。


答案:操作系统中的一个错误已修复,记录在案here

  

在平台版本17及更低版本中,RelativeLayout受到a的影响   可能导致子视图被测量的测量错误   MeasureSpec值不正确。 (参见MeasureSpec.makeMeasureSpec for   更多细节。)这是在RelativeLayout容器时触发的   放置在滚动容器中,例如ScrollView或   Horizo​​ntalScrollView。如果自定义视图未正确配备   使用MeasureSpec模式测量的被放置在一个   RelativeLayout,无论如何都会默默地作为RelativeLayout工作   会传递一个非常大的AT_MOST MeasureSpec。

我不会发布这个作为答案,Snicolas已经很好看了这个,所以他应得到他接受的答案。

1 个答案:

答案 0 :(得分:2)

我使用了这个小IDE one gist。而且,正如您所看到的,您收到的两个值都处于完全模式。如果我们遵循StackOverFlow最受欢迎的onMeasure的引用实现,它们都朝着同一个方向:

除了将它们传递给setMeasureDimensions之外,您无需做任何其他事情。您只能在不完全处于模式的情况下修改收到的措施。

我错过了什么吗?