出現這種情況很可能是因為設置了animation,並且調用了setFillAfter(true),這就會導致setVisibility無效,只需要調用一下clearAnimation()方法或者去掉setFillAfter(true)語句即可。
實驗證明只要在setVisibility之前設置View的mCurrentAnimation為null就可以,因此調用setAnimation(null)也是可以的。從源碼來看setFillAfter為false時也會間接導致調用clearAnimation,而clearAnimation在這里使setVisibility有效的原因也是置mCurrentAnimation為null了。
setFillAfter為false時間接導致clearAnimation:
而mCurrentAnimation使GONE無效的初步分析很可能是下面的代碼造成:
在dispatchDraw子View的時候,盡管不為VISIBLE,由於是||的關系,也會導致drawChild被調用。而drawChild的代碼如下:
/** * Draw one child of this View Group. This method is responsible for getting * the canvas in the right state. This includes clipping, translating so * that the child's scrolled origin is at 0, 0, and applying any animation * transformations. * * @param canvas The canvas on which to draw the child * @param child Who to draw * @param drawingTime The time at which draw is occurring * @return True if an invalidate() was issued */ protected boolean drawChild(Canvas canvas, View child, long drawingTime) { return child.draw(canvas, this, drawingTime); }
參考:http://bbs.csdn.net/topics/390311261
http://blog.csdn.net/xxxzhi/article/details/8846248
http://stackoverflow.com/questions/8690029/why-doesnt-setvisibility-work-after-a-view-is-animated
http://www.cnblogs.com/liulipeng/p/3962101.html