安卓中RelativeLayout的setVisbility属性设置为gone无效。

7
我正在使用RelativeLayout将旋转的Spinner动画放置在占位图像的顶部,同时真实的图像正在后台线程中加载。
当真实的位图准备就绪时,以下代码在UI线程中运行,使用Activity.runOnUiThread(Runnable):
问题是,在真实图像加载完成后,我所有试图隐藏旋转图像的尝试似乎都失败了。最终通过将底层的ImageView带到最前面才使其工作,但我只是好奇为什么setVisibility(View.GONE)和其他我尝试过的方法不起作用。我尝试了各种方法来隐藏旋转动画,但它们都没有起作用。
Spinner图像简单地在ImageView中声明为:
android:src="@drawable/spinner_black_20"

然后我在它上面启动旋转动画。一旦真实的图像被加载,这就是我尝试隐藏它的地方(如上所述,在UI线程中)

View v = (View)imageView.getParent();
ImageView spinner = (ImageView) v.findViewById(R.id.loading_spinner);
if (spinner != null) {
    spinner.getAnimation().cancel(); // this works, the animation stops
    spinner.setVisibility(View.INVISIBLE); // doesn't work, spinner bitmap still there
    spinner.setVisibility(View.GONE); // doesn't work
    spinner.getDrawable().setVisible(false, false); // tried this, no joy
    spinner.refreshDrawableState(); // thought this might help, nope
    spinner.invalidate(); // nor this
    imageView.bringToFront(); // this works, in that spinner disappears to background
}
imageView.setImageBitmap(bitmap);

你是否在 if(spinner != null) 块内记录或逐步执行调试器?如果检索 spinner 引用时出现错误,则此块不会执行。 - Rich
是的,我已经逐步执行了它。实际上,在执行该块时有两行代码是有效的:.cancel() 调用和 imageView.bringToFront() 调用。 - evaneus
2
这里只是一个想法...也许动画正在阻塞对setVisibility的调用。您能否在spinner的动画上设置AnimationListener,然后在onAnimationEnd方法中隐藏它? - Rich
这个问题在这里也被问到了,但仍然没有答案:http://stackoverflow.com/questions/6515470/imageview-visibility-issue-in-relative-layout - bigbigteam
1个回答

63

在设置可见性之前,请尝试调用spinner.clearAnimation();

这是Rich所提到的内容...


我也遇到了同样的问题,这个方法解决了我的问题! - TharakaNirmana
1
解决了我的问题!!谢谢!! - Haya Raed
1
@evaneus 我认为这是正确的答案。(不是像postDelayed那样的无用修复...它会引起更多的错误而不是修复它们。)请接受它。 - Evren Ozturk
谢谢,这解决了问题。我因为这个 bug 浪费了一个小时。 - Arlind Hajredinaj
太棒了,我很高兴找到了这个答案。我尝试了很多方法,比如使用invisible而不是gone并手动更新alpha,但实际上我需要清除动画。 - Justin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接