Android M footerView.getMeasuredHeight() returns 错误

Android M footerView.getMeasuredHeight() returns incorrectly

上 Android 中

footerView.getMeasuredHeight()

returns 3373。这发生在我检查过的所有设备上 运行 Android M。在 Nexus 5 上,它不会发生在 KitKat 版本上,但会发生在M版。我 运行 在实际设备上,从不在模拟器上。

测量发生在以下代码之后:

LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View appListItemView = layoutInflater.inflate(R.layout.view_selectable_app, null);
View headerView = layoutInflater.inflate(R.layout.app_feeds_container_header, null);
View footerView = layoutInflater.inflate(R.layout.apps_feed_container_footer, null);

appListItemView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
headerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
footerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));

appListItemView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
headerView.measure(View.MeasureSpec.EXACTLY, View.MeasureSpec.UNSPECIFIED);
footerView.measure(View.MeasureSpec.EXACTLY, View.MeasureSpec.UNSPECIFIED);

重要的是不要 header 测量正确。

您为 measure() 调用使用了错误的参数。 这是一个示例:

footerView 尺寸肯定不正确,因为你要求 EXACTLY,但具体是多少?

相反,它应该是这样的:

int widthMeasureSpec = MeasureSpec.makeMeasureSpec(parent.getWidth(), MeasureSpec.EXACTLY);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
footerView.measure(widthMeasureSpec, heightMeasureSpec);