如何在Android中自定义ProgressBar的启用/禁用状态样式?
实现方案
有成熟的XML实现方案,仅需配合极少量的状态同步代码即可完成需求:
一、XML实现(核心样式逻辑)
- 首先在
res/drawable目录下创建ProgressBar的状态选择器,命名为progress_background_states.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 禁用状态样式 --> <item android:state_enabled="false"> <layer-list> <item android:id="@android:id/background"> <shape> <solid android:color="#E0E0E0" /> <corners android:radius="8dp" /> </shape> </item> <item android:id="@android:id/progress"> <clip> <shape> <solid android:color="#BDBDBD" /> <corners android:radius="8dp" /> </shape> </clip> </item> </layer-list> </item> <!-- 启用状态样式 --> <item android:state_enabled="true"> <layer-list> <item android:id="@android:id/background"> <shape> <solid android:color="#E3F2FD" /> <corners android:radius="8dp" /> </shape> </item> <item android:id="@android:id/progress"> <clip> <shape> <solid android:color="#2196F3" /> <corners android:radius="8dp" /> </shape> </clip> </item> </layer-list> </item> </selector>
- 再给TextView创建文字颜色状态选择器,命名为
btn_text_states.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="#9E9E9E" android:state_enabled="false" /> <item android:color="#2196F3" android:state_enabled="true" /> </selector>
- 在组合视图的布局XML中绑定上面的配置即可
<merge xmlns:android="http://schemas.android.com/apk/res/android"> <ProgressBar android:id="@+id/background_progress" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:progressDrawable="@drawable/progress_background_states" android:max="100" /> <TextView android:id="@+id/btn_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textColor="@drawable/btn_text_states" /> </merge>
二、配套Java代码(状态同步)
仅需要重写自定义组合视图的setEnabled方法,把状态同步给内部子控件,即可自动触发XML选择器切换样式:
public class ProgressButton extends LinearLayout { private ProgressBar backgroundProgress; private TextView btnText; // 构造方法自行实现,在构造中完成布局inflate、两个子控件的初始化 @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); // 同步状态到子控件,样式会自动按XML配置切换 backgroundProgress.setEnabled(enabled); btnText.setEnabled(enabled); } }
如果需要添加状态切换动画,只需要在setEnabled方法中补充对应的属性动画逻辑即可,常规场景下上述方案可以直接满足需求。
内容的提问来源于stack exchange,提问作者JustAnEuropean
相关产品推荐
相关产品推荐

