gpt4 book ai didi

android - onMeasure() 调用 0x7fffffff 用于 heightMeasureSpec

转载 作者:行者123 更新时间:2023-11-29 21:27:20 25 4
gpt4 key购买 nike

我有一个覆盖 onMeasure 的自定义 View 。

我看到 onMeasure() 被调用了两次,第一次是在 0x7fffffff 处使用 heightMeasureSpec - 这似乎不是有效的 MeasureSpec 值。

然后,它再次被调用,这次调用的是正确的值。

以下是基本组件,已分解为相关部分:

自定义 View :

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>

此处的主要观察结果:

  • 自定义 View 具有固定的宽度和高度(自定义尺寸为 128dp)。
  • View 本身位于 RelativeLayout 中。
  • 所有这些都在 ScrollView 中。

在这种情况下,我首先使用 0x40000100、0x7fffffff 调用 onMeasure,然后使用 0x40000100、0x40000100 再次调用,这正是我最初的预期。

也许先用无效高度调用 onMeasure 是完全正常的?我可以忽略它,但我不想在这里添加任何技巧。


回答:这是操作系统中的错误,已修复,记录在案 here :

In platform version 17 and lower, RelativeLayout was affected by a measurement bug that could cause child views to be measured with incorrect MeasureSpec values. (See MeasureSpec.makeMeasureSpec for more details.) This was triggered when a RelativeLayout container was placed in a scrolling container, such as a ScrollView or HorizontalScrollView. If a custom view not equipped to properly measure with the MeasureSpec mode UNSPECIFIED was placed in a RelativeLayout, this would silently work anyway as RelativeLayout would pass a very large AT_MOST MeasureSpec instead.

我不打算将此作为答案发布,Snicolas 已经足够好地看待这个问题,所以他应该得到他接受的答案。

最佳答案

我用了这个小IDE one gist .而且,如您所见,您收到的两个值都处于 EXACTLY 模式。如果我们遵循 StackOverFlow 上最受欢迎的 onMeasure 的引用实现,它们都朝着相同的方向发展:

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

我错过了什么吗?

关于android - onMeasure() 调用 0x7fffffff 用于 heightMeasureSpec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20027788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com