ImageView.setImageResource的坑

2016-08-30  本文已影响598人  2ece9f02c806

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


Paste_Image.png Paste_Image.png

这个时候通常会用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(),然后软键盘重新回到默认的中文输入页面。坑吧!

所以遇到这种情况就把两张图做到一样大吧!!

上一篇 下一篇

猜你喜欢

热点阅读