如何在Main Activity中实现GradientDrawable并解决交通灯颜色切换问题
解决交通灯颜色切换问题
你的代码存在三个核心问题:getResources().getColor()方法已过时、GradientDrawable没有直接的getColor()方法、依赖Drawable读取颜色的判断逻辑不可靠。以下是修正后的完整解决方案:
步骤1:声明成员变量维护颜色状态
在MainActivity类中添加成员变量,直接记录当前交通灯的颜色资源ID,避免从Drawable中读取颜色的麻烦:
private TextView light; private Button change; // 初始颜色设为红色 private int currentLightColor = R.color.red;
步骤2:初始化圆形标签的兼容代码
替换过时的颜色获取方式,使用兼容全版本的ContextCompat.getColor():
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); light = findViewById(R.id.traffic_light_circle); change = findViewById(R.id.change); // 初始化圆形交通灯样式 GradientDrawable drawable = new GradientDrawable(); drawable.setShape(GradientDrawable.OVAL); drawable.setColor(ContextCompat.getColor(this, currentLightColor)); light.setBackground(drawable); // 绑定按钮点击事件 setChangeButtonListener(); }
步骤3:修正按钮点击切换逻辑
直接通过成员变量判断当前颜色,切换后更新变量与Drawable颜色,无需重复设置Background:
private void setChangeButtonListener() { change.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { GradientDrawable drawable = (GradientDrawable) light.getBackground(); // 按红→黄→绿→红的顺序循环切换 if (currentLightColor == R.color.red) { currentLightColor = R.color.yellow; } else if (currentLightColor == R.color.yellow) { currentLightColor = R.color.green; } else if (currentLightColor == R.color.green) { currentLightColor = R.color.red; } // 更新Drawable颜色 drawable.setColor(ContextCompat.getColor(MainActivity.this, currentLightColor)); } }); }
关键说明
- 用成员变量
currentLightColor记录状态,比从Drawable中读取颜色更稳定,避免因ColorStateList或API版本差异导致的判断错误。 ContextCompat.getColor()适配所有Android版本,替代已废弃的getResources().getColor()方法。- 修改GradientDrawable的颜色后,无需重新调用
light.setBackground(drawable),因为Drawable是对象引用,修改后会自动刷新UI。
内容的提问来源于stack exchange,提问作者Aimex
相关产品推荐
相关产品推荐

