Flutter插件开发中如何显示Android新版原生ProgressDialog
Flutter插件调用Android原生ProgressDialog显示旧样式问题修复
问题现象
开发Flutter插件时,通过如下代码调用Android原生进度对话框:
ProgressDialog progressDialog =new ProgressDialog(context); progressDialog.setTitle("Downloading"); progressDialog.setMessage("Please wait while downloading map"); progressDialog.setCanceledOnTouchOutside(false); progressDialog.show();
实际运行显示旧版Holo风格对话框:
预期显示新建原生Android项目默认的Material风格对话框:
插件默认的AndroidManifest.xml内容如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.map_plugin"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> </manifest>
曾尝试在清单中添加application标签配置主题,但完全不生效,尝试的配置如下:
<application android:theme="@android:style/Theme.Material.Light.DarkActionBar"></application>
问题原因
- Flutter插件属于Android库模块,库模块清单文件中配置的
application级主题会在构建合并时被宿主App的主题配置覆盖,因此修改插件自身清单的application主题无效。 - 创建ProgressDialog时如果传入的是Application级上下文,或者上下文未关联Material主题,对话框会自动回退到旧版Holo样式。
修复方案
直接在构造ProgressDialog时传入指定的Material主题,同时使用当前前台Activity作为上下文,不要用Application上下文,该方案不受宿主主题配置影响,稳定生效:
// 第一个参数传入当前前台Activity实例(Flutter插件可通过ActivityAware接口获取) // 第二个参数传入系统自带的Material Light对话框主题,和原生新项目默认样式完全一致 ProgressDialog progressDialog =new ProgressDialog(activityContext, android.R.style.Theme_Material_Light_Dialog_Alert); progressDialog.setTitle("Downloading"); progressDialog.setMessage("Please wait while downloading map"); progressDialog.setCanceledOnTouchOutside(false); progressDialog.show();
如果需要适配深色模式,可以替换主题为android.R.style.Theme_Material_Dialog_Alert即可。
注:ProgressDialog类已在Android API 26被官方废弃,长期维护的项目建议使用DialogFragment包裹ProgressBar实现自定义加载对话框,避免后续系统版本兼容问题。
内容的提问来源于stack exchange,提问作者KonTash
相关产品推荐
相关产品推荐

