请教如何精简Android中ProgressBar的实现代码
嘿,我来帮你把这段ProgressBar相关的代码精简得更清爽~
几个精简方向和优化后的代码
1. 把进度条颜色设置移到XML(最推荐)
与其在代码里写颜色滤镜逻辑,不如直接在ProgressBar的XML布局里配置样式,这样能砍掉一行代码:
<ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" <!-- 直接在这里设置颜色和混合模式 --> android:indeterminateTint="@color/green" android:indeterminateTintMode="src_in" />
做完这步,代码里就能删掉progressBar.getIndeterminateDrawable().setColorFilter(...)这一行啦。
2. 用View Binding替代findViewById
如果你的项目已经启用了View Binding(现在Android开发的主流做法),获取控件会更简洁,不用手动做类型转换:
// 假设你的布局对应的Binding类是YourLayoutBinding YourLayoutBinding binding = YourLayoutBinding.inflate(getLayoutInflater()); ProgressBar progressBar = binding.progress;
如果还没启用View Binding,直接用原有的findViewById也没问题,这步主要是配合View Binding让代码更干净。
3. 简化Glide的监听逻辑
原代码里的匿名内部类可以把重复的隐藏进度条逻辑提取成单独方法,让代码结构更清晰:
// 先获取进度条(这里用XML设置颜色的情况) ProgressBar progressBar = findViewById(R.id.progress); // Glide加载部分 GlideApp.with(this) .load(url) .listener(new RequestListener<Drawable>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { hideProgress(progressBar); return false; } @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { hideProgress(progressBar); return false; } }) .into(yourImageView); // 记得替换成你的ImageView实例 // 提取重复的隐藏进度条方法 private void hideProgress(ProgressBar progressBar) { progressBar.setVisibility(View.GONE); }
如果你的项目支持Java 8+,还可以用静态内部类+实例化的方式进一步简化,避免重复写匿名类:
// 定义一个复用的监听类 private static class ProgressHideListener implements RequestListener<Drawable> { private final ProgressBar progressBar; public ProgressHideListener(ProgressBar progressBar) { this.progressBar = progressBar; } @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { progressBar.setVisibility(View.GONE); return false; } @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { progressBar.setVisibility(View.GONE); return false; } } // 然后Glide部分就可以写成: GlideApp.with(this) .load(url) .listener(new ProgressHideListener(progressBar)) .into(yourImageView);
4. 如果用Kotlin的话(额外福利)
如果你的项目可以转Kotlin,代码会精简到极致:
// XML已经设置了进度条颜色 val progressBar = binding.progress GlideApp.with(this) .load(url) .listener(object : RequestListener<Drawable> { override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean { progressBar.visibility = View.GONE return false } override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { progressBar.visibility = View.GONE return false } }) .into(yourImageView)
内容的提问来源于stack exchange,提问作者Hipólito Huaylla
相关产品推荐
相关产品推荐

