有时候我们会需要在一个ImageView中根据状态不同设置为不同的图片,如图:


这个时候通常会用setImageResource来换图片,但是这里有一个坑,就是当你设置的两张图片的大小不一样的时候,View会重新layout,看源码
public void setImageResource(@DrawableRes int resId) {
// The resource configuration may have changed, so we should always
// try to load the resource even if the resId hasn't changed.
final int oldWidth = mDrawableWidth;
final int oldHeight = mDrawableHeight;
updateDrawable(null);
mResource = resId;
mUri = null;
resolveUri();
if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
requestLayout();
}
invalidate();
}
当新的图片与原来的图片大小不一样的话就会调用requestLayout()来重新布局。
一般情况下这个影响不大,但是,当你这个ImageView在ListView的item中的时候就会导致ListView重新调用getView,这就可能导致item中某些状态回到默认。
我遇到的问题是:在ListView的item中有一个EditText,一个ImageView,ImageView的逻辑是,当输入框有内容则图片显示为删除的X图片。
当我在EditText中输入时,调起软键盘,默认是中文输入,当我切换到数字键盘输第一个数字,立马回到中文输入,想连着输入数字就要再切换一下数字输入。
原因就是当我输入一个数字后,ImageView调用setImageResource将图片换成X,而这个X图与之前的图片大小不一样,于是requestLayout(),然后软键盘重新回到默认的中文输入页面。坑吧!
所以遇到这种情况就把两张图做到一样大吧!!
网友评论