Android应用对接OpenWeatherMap API展示天气图标报错咨询
问题修复方案
报错原因说明
- 第一个报错:你将
imageofWeather.setImageDrawable(drawableResource);写在了switch结构内部、所有case的break之后,所有case匹配成功执行break后都会直接跳出switch,这行代码永远不会被执行,所以系统提示赋值的资源从未被使用。 - 第二个报错:
setImageDrawable()方法要求传入Drawable对象,你传入的是R.drawable.xxx格式的int类型资源ID,方法不匹配。
修改步骤
- 调整setImage代码位置,移到switch结构外部,同时替换为接收资源ID的
setImageResource()方法 - 给drawableResource设置初始默认值,新增default分支处理未知天气情况
- 无数据时隐藏天气图标,符合首次打开不展示图标的需求
关键代码修改示例
1. 变量初始化修改
// 初始赋值0代表无图标 int drawableResource = 0;
2. switch逻辑修改
// get actual weather. switch (data.getWeather().get(0).getIcon()) { case WeatherIcon.Sun: drawableResource = R.drawable.sun; break; case WeatherIcon.Cloud1: drawableResource = R.drawable.broken_clouds; break; case WeatherIcon.Cloud2: drawableResource = R.drawable.few_clouds; break; case WeatherIcon.Cloud3: drawableResource = R.drawable.scattered_clouds; break; case WeatherIcon.Rain1: drawableResource = R.drawable.small_rain; break; case WeatherIcon.Rain2: drawableResource = R.drawable.shower_rain; break; case WeatherIcon.Thunder: drawableResource = R.drawable.thunderstorm; break; case WeatherIcon.Snow: drawableResource = R.drawable.snow; break; case WeatherIcon.Mist: drawableResource = R.drawable.mist; break; // 新增默认分支处理未知天气 default: drawableResource = 0; break; } // 移到switch外部执行图标设置 if (drawableResource != 0) { imageofWeather.setImageResource(drawableResource); imageofWeather.setVisibility(View.VISIBLE); } else { imageofWeather.setVisibility(View.GONE); }
3. 无数据分支新增图标隐藏
在data == null的else分支的隐藏逻辑中,新增一行:
imageofWeather.setVisibility(View.GONE);
额外注意事项
如果data.getWeather().get(0).getIcon()返回的是OpenWeatherMap原生的字符串值(比如01d、02n这类),而不是你定义的WeatherIcon枚举,需要把switch的case对应改为字符串匹配规则,否则会无法正确匹配天气类型。
内容的提问来源于stack exchange,提问作者Richard Wilson
相关产品推荐
相关产品推荐

