Android简易天气预报App 您所在的位置:网站首页 天气预报日历表制作 Android简易天气预报App

Android简易天气预报App

2023-07-19 10:23| 来源: 网络整理| 查看: 265

先看下app效果图:

        App介绍:首次启动应用时列表显示全国34个省份及直辖市包括港澳台,如果选择省份进入所在省份下的市列表,如果再选择市项进入该市下所有的区或县(包括该市)列表,如果再选择该列表下的项就显示该区域的天气预报界面。图5从左滑出侧边栏可以选择其他城市。如果是非首次启动,则显示上次选择的城市天气预报界面(比如退出时显示广州的天气预报界面即图4,再次进入时仍显示该界面)。

具体app功能实现:

1.获取全国城市列表(图1到图3)

       想罗列出中国所有的省份,只需要访问地址:http://guolin.tech/api/china,服务器会返回一段JSON格式的数据,包含中国所有省份名称以及省份id。如果想知道某个省份内有哪些城市,比如江苏的id是16,访问地址:http://guolin.tech/api/china/16。只需要把省份id添加到url地址的最后面即可。比如苏州的id是116,那么想知道苏州下有哪些县和区的时候,访问地址:http://guolin.tech/api/china/16/116。如此类推。

     本app使用DataSupport这款开源的数据库框架进行城市查询,需要在app下的build.gradle导入:

implementation 'org.litepal.android:core:1.4.1'

在清单文件中的application节点中加入:

android:name="org.litepal.LitePalApplication"

此外还需要在assets目录下新建litepal.xml,构建名为weather_db的数据库,分别构建Province、City、County三张表。

对于省份、城市、区或县进行数据库查询,则这些实体类需要继承自DataSupport:

package db; import org.litepal.crud.DataSupport; public class City extends DataSupport { private int id; private String cityName; private int cityCode; private int provinceId; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } public int getCityCode() { return cityCode; } public void setCityCode(int cityCode) { this.cityCode = cityCode; } public int getProvinceId() { return provinceId; } public void setProvinceId(int provinceId) { this.provinceId = provinceId; } } package db; import org.litepal.crud.DataSupport; public class County extends DataSupport { private int id; private String countyName; private String weatherId; public String getWeatherId() { return weatherId; } public void setWeatherId(String weatherId) { this.weatherId = weatherId; } private int cityId; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCountyName() { return countyName; } public void setCountyName(String countyName) { this.countyName = countyName; } public int getCityId() { return cityId; } public void setCityId(int cityId) { this.cityId = cityId; } } package db; import org.litepal.crud.DataSupport; public class Province extends DataSupport { private int id; private String provinceName; private int provinceCode; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getProvinceName() { return provinceName; } public void setProvinceName(String provinceName) { this.provinceName = provinceName; } public int getProvinceCode() { return provinceCode; } public void setProvinceCode(int provinceCode) { this.provinceCode = provinceCode; } }

 

访问服务器,所以需要在清单文件加入访问网络的权限:

 主程序布局仅由一个fragment组成,该fragment的布局由一个自定义的标题栏和一个listview组成:

activity_main.xml

 fragment的布局choose_area.xml

 城市列表显示界面ChooseAreaFragment,本文使用okhttp进行网络请求,所以需在build.gradle添加:

implementation 'com.squareup.okhttp3:okhttp:3.4.1'

该fragment的代码及分析如下: 

package mini.org.miniweather.fragment; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import org.litepal.crud.DataSupport; import java.io.IOException; import java.util.ArrayList; import java.util.List; import db.City; import db.County; import db.Province; import mini.org.miniweather.MainActivity; import mini.org.miniweather.R; import mini.org.miniweather.WeatherActivity; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; import util.HttpUtil; import util.Utility; public class ChooseAreaFragment extends Fragment { private static final int LEVEL_PROVINCE = 0; private static final int LEVEL_CITY = 1; private static final int LEVEL_COUNTY = 2; private List dataList = new ArrayList(); private ArrayAdapter adapter; private TextView titleText; private ImageView backButton; private ListView listView; private ProgressDialog progressDialog; /** * 省列表 */ private List provinceList; /** * 城市列表 */ private List cityList; /** * 城镇列表 */ private List countyList; /** * 当前等级 */ private int currentLevel; /** * 选中的省份 */ private Province selectedProvince; /** * 选中的城市 */ private City selectedCity; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.choose_area,container,false); titleText = (TextView)view.findViewById(R.id.title); backButton = (ImageView)view.findViewById(R.id.back); listView = (ListView)view.findViewById(R.id.listview); adapter = new ArrayAdapter(getContext(),android.R.layout.simple_list_item_1,dataList); listView.setAdapter(adapter); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); queryProvinces(); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { if (currentLevel == LEVEL_PROVINCE){ selectedProvince = provinceList.get(position); queryCities(); }else if (currentLevel == LEVEL_CITY){ selectedCity = cityList.get(position); queryCounties(); }else if (currentLevel == LEVEL_COUNTY){ String weatherId = countyList.get(position).getWeatherId(); if (getActivity() instanceof MainActivity){ Intent intent = new Intent(getActivity(), WeatherActivity.class); intent.putExtra("weather_id",weatherId); startActivity(intent); getActivity().finish(); }else if (getActivity() instanceof WeatherActivity){ WeatherActivity activity = (WeatherActivity)getActivity(); activity.drawerLayout.closeDrawers(); activity.getWeatherInfo(weatherId); } } } }); backButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (currentLevel == LEVEL_COUNTY){ queryCities(); }else if (currentLevel == LEVEL_CITY){ queryProvinces(); } } }); } /** * 查询所有的省,优先从数据库查询,如果没有查到再去服务器上查询 */ private void queryProvinces(){ titleText.setText("中国"); backButton.setVisibility(View.GONE); provinceList = DataSupport.findAll(Province.class); if (provinceList.size()>0){ dataList.clear(); for (Province province:provinceList){ dataList.add(province.getProvinceName()); } adapter.notifyDataSetChanged(); listView.setSelection(0); currentLevel = LEVEL_PROVINCE; }else{ String address = "http://guolin.tech/api/china"; queryFromServer(address,"province"); } } /** * 查询选中省内所有的市,优先从数据库查询,如果没有查询到再去服务器上查询。 */ private void queryCities() { titleText.setText(selectedProvince.getProvinceName()); backButton.setVisibility(View.VISIBLE); cityList = DataSupport.where("provinceid = ?", String.valueOf(selectedProvince.getId())).find(City.class); if (cityList.size()>0){ dataList.clear(); for (City city:cityList){ dataList.add(city.getCityName()); } adapter.notifyDataSetChanged(); listView.setSelection(0); currentLevel = LEVEL_CITY; }else { int provinceCode = selectedProvince.getProvinceCode(); String address = "http://guolin.tech/api/china/"+provinceCode; queryFromServer(address,"city"); } } /** * 查询选中市内所有的县,优先从数据库查询,如果没有查询到再去服务器上查询。 */ private void queryCounties() { titleText.setText(selectedCity.getCityName()); backButton.setVisibility(View.VISIBLE); countyList = DataSupport.where("cityid=?", String.valueOf(selectedCity.getId())).find(County.class); if (countyList.size() >0){ dataList.clear(); for (County county:countyList){ dataList.add(county.getCountyName()); } adapter.notifyDataSetChanged(); listView.setSelection(0); currentLevel = LEVEL_COUNTY; }else{ int provinceCode = selectedProvince.getProvinceCode(); int cityCode = selectedCity.getCityCode(); String address = "http://guolin.tech/api/china/" + provinceCode + "/" + cityCode; queryFromServer(address,"county"); } } /** * 根据传入的地址和类型从服务器上查询省市县数据 * @param address * @param type */ private void queryFromServer(String address, final String type) { showProgressDialog(); HttpUtil.sendOkhttpRequest(address, new Callback() { @Override public void onFailure(Call call, IOException e) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { closeProgressDialog(); Toast.makeText(getContext(),"加载失败",Toast.LENGTH_SHORT).show(); } }); } @Override public void onResponse(Call call, Response response) throws IOException { String responceText = response.body().string(); boolean result = false; if ("province".equals(type)){ result = Utility.handleProvinceResponce(responceText); }else if ("city".equals(type)){ result = Utility.handleCityResponce(responceText,selectedProvince.getId()); }else if ("county".equals(type)){ result = Utility.handleCountyResponce(responceText,selectedCity.getId()); } if(result){ getActivity().runOnUiThread(new Runnable() { @Override public void run() { closeProgressDialog(); if ("province".equals(type)){ queryProvinces(); }else if ("city".equals(type)){ queryCities(); }else if ("county".equals(type)){ queryCounties(); } } }); } } }); } /** * 显示进度对话框 */ private void showProgressDialog() { if (progressDialog == null){ progressDialog = new ProgressDialog(getActivity()); progressDialog.setMessage("正在加载..."); progressDialog.setCanceledOnTouchOutside(false); } progressDialog.show(); } /** * 关闭进度对话框 */ private void closeProgressDialog(){ if (progressDialog!=null){ progressDialog.dismiss(); } } }

该fragment涉及的工具类如下:

package util; import okhttp3.OkHttpClient; import okhttp3.Request; public class HttpUtil { public static void sendOkhttpRequest(String address,okhttp3.Callback callback){ OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url(address).build(); client.newCall(request).enqueue(callback); } } package util; import android.text.TextUtils; import android.util.Log; import com.google.gson.Gson; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import db.City; import db.County; import db.Province; import interfaces.heweather.com.interfacesmodule.bean.weather.Weather; public class Utility { /** * 解析和返回服务器返回的省级数据 */ public static boolean handleProvinceResponce(String responce){ if (!TextUtils.isEmpty(responce)){ try { JSONArray allProvinces = new JSONArray(responce); for (int i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有