Android自定义Dialog中ProgressBar不动画的原因及添加方案咨询
我在自定义Android Dialog时添加了一个进度加载圈(ProgressBar),但它完全不播放动画。相关代码如下:
Java代码:
Dialog dialog = new Dialog(this,R.style.mydialog); dialog.setContentView(R.layout.dialog); dialog.show();
布局文件dialog.xml:
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center"> <ProgressBar android:layout_width="@dimen/progressbar_width" android:layout_height="@dimen/progressbar_height" android:layout_marginTop="@dimen/progressbar_margin" android:layout_marginBottom="@dimen/progressbar_margin" android:indeterminateTint="@color/light_blue" android:indeterminateTintMode="src_atop" /> <TextView android:id="@+id/dialog_loading_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/progressbar_margin" android:gravity="center" android:textColor="@android:color/white" android:textSize="@dimen/progressbar_message_text_size" android:visibility="gone" /> </LinearLayout>
当前进度加载圈完全没有动画效果,请问有人知道原因和解决办法吗?
我之前也碰到过一模一样的问题,大概率是这几个常见原因导致的,你可以逐个排查试试:
检查自定义Dialog的Style是否禁用了动画
你用了R.style.mydialog这个自定义样式,说不定里面设置了android:windowAnimationStyle="@null"这类属性,把窗口的动画给禁用了,连带影响了ProgressBar的动画。打开对应的style文件看看,如果有这类配置,要么移除它,要么给ProgressBar单独指定动画资源。ProgressBar的尺寸设置过小
你用了自定义的@dimen/progressbar_width和@dimen/progressbar_height,如果这两个值设得太小,可能会让动画无法正常渲染。可以先临时改成50dp这种固定值测试下,看看动画能不能正常跑起来。未显式指定indeterminateDrawable
自定义tint有时候会干扰默认动画的加载,你可以尝试给ProgressBar明确指定系统默认的不确定进度条Drawable:android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal"如果项目用了Material Components库,也可以把ProgressBar的style设为
@style/Widget.MaterialComponents.ProgressBar.Indeterminate试试。Dialog的窗口属性冲突
如果你的自定义style里设置了android:windowIsFloating="false"或者其他特殊窗口属性,可能会导致视图动画无法正常启动。可以先简化样式,用系统默认的Dialog样式测试,确认动画正常后再逐步加自定义属性。主线程被阻塞
要是在调用dialog.show()前后,主线程在执行耗时操作(比如网络请求、大量计算),ProgressBar的动画会因为主线程卡着而没法播放。检查下相关代码,把耗时操作移到子线程里执行就行。
优先从检查自定义Style开始排查吧,这是最常见的诱因,希望这些方法能帮你解决问题!
内容的提问来源于stack exchange,提问作者Davis Dong




