我有一个自定义视图,我正在为ListView
充气,我正在尝试设置它的确切宽度和高度。但是,尽管在更新的API上工作,它仍然在API 17: 4.2.2
失败。这是我的适配器getView()
:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
convertView = getInflater().inflate(R.layout.list_view_layout, parent, false);
CustomImageView image = (CustomImageView) convertView.findViewById(R.id.list_view_image);
image.setLayoutParams(new LinearLayout.LayoutParams(300, 200));
return convertView;
}
这是视图的onMeasure()
:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
if (widthMode == MeasureSpec.EXACTLY || heightMode == MeasureSpec.EXACTLY) {
setMeasuredDimension(widthSize, heightSize);
}
else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
使用调试器,我可以看到widthMeasureSpec
是正确的(宽度正确,MeasureSpec.EXACTLY
已设置。)在较新的API级别上,heightMeasureSpec
也是正确的。 但是,我最近尝试API 17
,发现传递的heightMeasureSpec
值为0
(相当于MeasureSpec.UNSPECIFIED
)。
是否有任何见解为什么这不适用于API 17
?
答案 0 :(得分:0)
似乎在这个api的视图中已经做了一些改变,我也遇到了这种stange行为。尝试使用ViewTreeObserver.OnGlobalLayoutListener。
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
view.getX();
view.getY();
}
});
答案 1 :(得分:0)
在onWindowFocusChanged中已经加载了UI元素。 你可以在那里获得数据。
答案 2 :(得分:0)
我不太确定为什么API17单独表现不同(希望可能是一个bug)。但似乎问题可能出在ListView的滚动垂直行为中,因为只有Height受此影响。可能在这种情况下,不考虑指定的高度和" wrap_content"被选中。
但是我希望你现在有一个解决方法。如果没有,那么你可以继续处理MeasureSpec.UNSPECIFIED
中的onMeasure()
案例。
在我的自定义视图中,我始终确保处理所有案例:已发布,完全和 AT_MOST 。
答案 3 :(得分:0)
我没有弄清楚意外行为的原因,但我做了一个hacky work-around。
适配器:
Accept-Ranges: bytes
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
convertView = getInflater().inflate(R.layout.list_view_layout, parent, false);
CustomImageView image = (CustomImageView) convertView.findViewById(R.id.list_view_image);
image.setDimensions(new Point(300, 200));
image.requestLayout();
return convertView;
}
:
CustomImageView