文章目录
显示天气信息
解析天气数据
首先,天气信息的形式是JSON,借助GSON来对天气信息进行解析。
数据的大致形式如下:
其中,除了状态status内容为字符串,其他5类中都再包含具体内容,故可以定义5个具体的类来描述他们。
basic
basic中,city表示城市名,id为城市对应的Weather_id,又包含一个update类,所以需要一个update类,里面包含一个字符串loc表示更新时间。按照此结构可以在gson下建立Basic类。
public class Basic {
//由于JSON中的一些字段可能不太适合直接作为Java字段来命名,因此这里使用了
//@ SerializedName注解的方式来让JSON字段和Java字段之间建立映射关系
@SerializedName("city")
public String cityName;
@SerializedName("id")
public String weatherId;
public Update update;
public class Update{
@SerializedName("loc")
public String updateTime;
}
}
aqi
其他几个类也类似
AQI表示空气质量
建立AQI类来对应JSON类:
public class AQI {
public AQICity city;
public class AQICity{
public String aqi;
public String pm25;
}
}
now
now中包含当前温度和一个cond类来包含当前天气类别。
public class Now {
@SerializedName("tmp")
public String tmp;
@SerializedName("cond")
public More More;
public class More{
@SerializedName("txt")
public String info;
}
}
suggestion
建议类中包含三个类,comf表示天气体感,cw表示洗车建议,sport表示运动建议
public class Suggestion {
@SerializedName("comf")
public Comfort comfort;
@SerializedName("cw")
public CarWash carWash;
public Sport sport;
public class Sport{
@SerializedName("txt")
public String info;
}
public class CarWash{
@SerializedName("txt")
public String info;
}
public class Comfort{
@SerializedName("txt")
public String info;
}
}
daily_forecast
这个类比较特殊,包含未来一周天气信息,由于每天的信息都是相同的,所以只需定义出单日的天气实体类即可,然后在使用时使用集合类封装即可。
/*
可以看到, daily forecast中包含的是一个数组,数组中的每一项都代表着未来一天的天
气信息。针对于这种情况,我们只需要定义出单日天气的实体类就可以了,然后在声明实体类引
用的时候使用集合类型来进行声明。
*/
public class Forecast {
public String date;
@SerializedName("cond")
public More more;
@SerializedName("tmp")
public Temperature Temperature;
public class Temperature{
public String max;
public String min;
}
public class More{
@SerializedName("txt_d")
public String info;
}
}
weather
还需要一个总的实例类来将上面创建好的类整合起来。
/*
在 Weather类中,我们对 Basic、AQI、NoW、 Suggestion和 Forecast类进行了引用。其
中,由于 daily forecast中包含的是一个数组,因此这里使用了List集合来引用 Forecast类。
*/
public class Weather {
/*
另外,返回的天气数据中还会包含一项 status数据,成功返回ok,失败则会返回具体的原因,那
么这里也需要添加一个对应的 status字段
现在所有的GSON实体类都定义好了,接下来我们开始编写天气界面。
*/
public String status;
public Basic basic;
public AQI aqi;
public Now now;
public Suggestion suggestion;
@SerializedName("daily_forecast")
public List<Forecast> mForecastList;
}
其中,由于daily_forecast中包含一个数组,因此使用了List集合来引用Forecast类。
编写天气界面
这部分没什么好总结的,接按照需要编写即可,注意的是由于界面比较复杂,所有可以分开编写xml文件然后汇总在界面中。
activity_weather.xml
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/bing_pic_img"
android:scaleType="centerCrop"/>
<ScrollView
android:id="@+id/weather_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
android