You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:40:09