Android之简易天气预报小应用(xml解析练手)
16lz
2021-01-24
界面比较简陋。实现后的大致效果如下:
该应用的所有功能主要是通过解析http://www.webxml.com.cn/webservices/weatherwebservice.asmx网站提供的Xml返回数据来实现,Xml解析的方法可参考我的上一篇博客:Android之使用Pull解析Xml数据
具体代码如下:(代码中用到的图片可从上面网站上下载)
布局代码:activity_weather_test.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.ygd.jreduch09.WeatherTestActivity"> <Spinner android:id="@+id/sp1" android:layout_width="match_parent" android:layout_height="wrap_content"> </Spinner> <Spinner android:id="@+id/sp2" android:layout_below="@+id/sp1" android:layout_width="match_parent" android:layout_height="wrap_content"> </Spinner> <TextView android:id="@+id/tv" android:layout_below="@id/sp2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="12℃/20℃" android:layout_centerHorizontal="true" android:textSize="50sp" android:layout_marginTop="30dp"/> <TextView android:id="@+id/tv0" android:layout_marginTop="30dp" android:layout_marginBottom="60dp" android:layout_below="@id/tv" android:text="今日天气实况:气温:14℃;风向/风力:东南风 1级;湿度:65%;紫外线强度:暂缺。空气质量:暂缺。" android:textSize="24sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <GridLayout android:id="@+id/gl" android:layout_below="@id/tv0" android:orientation="horizontal" android:columnCount="4" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv1" android:text="5月10日 晴" android:layout_columnWeight="1" android:textSize="18sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/iv1" android:src="@mipmap/a" android:layout_columnWeight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <ImageView android:id="@+id/iv2" android:src="@mipmap/b" android:layout_columnWeight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv2" android:layout_columnWeight="1" android:textSize="18sp" android:text="西北风转西南风3-4级" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv3" android:text="5月10日 晴" android:layout_columnWeight="1" android:textSize="18sp" android:layout_marginTop="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/iv3" android:src="@mipmap/a" android:layout_marginTop="10dp" android:layout_columnWeight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <ImageView android:id="@+id/iv4" android:src="@mipmap/b" android:layout_columnWeight="1" android:layout_marginTop="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv4" android:layout_columnWeight="1" android:textSize="18sp" android:text="16℃/27℃" android:layout_marginTop="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv5" android:text="5月10日 晴" android:layout_columnWeight="1" android:textSize="18sp" android:layout_marginTop="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/iv5" android:src="@mipmap/a" android:layout_marginTop="10dp" android:layout_columnWeight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <ImageView android:id="@+id/iv6" android:src="@mipmap/b" android:layout_columnWeight="1" android:layout_marginTop="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv6" android:layout_columnWeight="1" android:textSize="18sp" android:layout_marginTop="10dp" android:text="11℃/25℃" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </GridLayout> <!--<LinearLayout--> <!--android:id="@+id/ll"--> <!--android:layout_below="@id/sp2"--> <!--android:orientation="horizontal"--> <!--android:layout_width="match_parent"--> <!--android:layout_height="wrap_content">--> <!--<ImageView--> <!--android:id="@+id/iv1"--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content" />--> <!--<ImageView--> <!--android:id="@+id/iv2"--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content" />--> <!--<ImageView--> <!--android:id="@+id/iv3"--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content" />--> <!--<ImageView--> <!--android:id="@+id/iv4"--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content" />--> <!--<ImageView--> <!--android:id="@+id/iv5"--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content" />--> <!--<ImageView--> <!--android:id="@+id/iv6"--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content" />--> <!--</LinearLayout>--> <!--<TextView--> <!--android:id="@+id/tv"--> <!--android:layout_below="@+id/ll"--> <!--android:layout_width="match_parent"--> <!--android:layout_height="match_parent" />--></RelativeLayout>
- 主函数代码:WeatherTestActivity.java
public class WeatherTestActivity extends AppCompatActivity { private String URL_PROVINCE="http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getSupportProvince"; private String URL_CITY="http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getSupportCity"; private String URL_WEATHER="http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getWeatherbyCityName"; private List provinceList,cityList; private Spinner sp1,sp2; private TextView tv,tv0,tv1,tv2,tv3,tv4,tv5,tv6; private ImageView[] iv=new ImageView[6]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_weather_test); sp1= (Spinner) findViewById(R.id.sp1); sp2= (Spinner) findViewById(R.id.sp2); tv= (TextView) findViewById(R.id.tv); tv0= (TextView) findViewById(R.id.tv0); tv1= (TextView) findViewById(R.id.tv1); tv2= (TextView) findViewById(R.id.tv2); tv3= (TextView) findViewById(R.id.tv3); tv4= (TextView) findViewById(R.id.tv4); tv5= (TextView) findViewById(R.id.tv5); tv6= (TextView) findViewById(R.id.tv6); iv[0]= (ImageView) findViewById(R.id.iv1); iv[1]= (ImageView) findViewById(R.id.iv2); iv[2]= (ImageView) findViewById(R.id.iv3); iv[3]= (ImageView) findViewById(R.id.iv4); iv[4]= (ImageView) findViewById(R.id.iv5); iv[5]= (ImageView) findViewById(R.id.iv6); new MyDoGetProvince().execute(URL_PROVINCE); sp1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Log.d("===","pos="+position+",id="+id); if(provinceList!=null&&provinceList.size()>0){ String url=URL_CITY+"?byProvinceName="+provinceList.get(position); new MyDoGetCity().execute(url); } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); sp2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if(cityList!=null&&cityList.size()>0){ String city=cityList.get(position).toString().substring(0,2); Log.d("===city",""+city); String url=URL_WEATHER+"?theCityName="+city; new MyDoGetWeather().execute(url); } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } public class MyDoGetProvince extends AsyncTask<String,Void,List>{ @Override protected List doInBackground(String... params) { return HttpUtil.doGetXml(params[0]); } @Override protected void onPostExecute(List list) { super.onPostExecute(list); if(list!=null&&list.size()>0){ provinceList=list; ArrayAdapter aa=new ArrayAdapter(getBaseContext(),android.R.layout.simple_spinner_item,provinceList); sp1.setAdapter(aa); } } } public class MyDoGetCity extends AsyncTask<String,Void,List>{ @Override protected List doInBackground(String... params) { return HttpUtil.doGetXml(params[0]); } @Override protected void onPostExecute(List list) { super.onPostExecute(list); if(list!=null&&list.size()>0){ cityList=list; ArrayAdapter aa=new ArrayAdapter(getBaseContext(),android.R.layout.simple_spinner_item,cityList); sp2.setAdapter(aa); } } } public class MyDoGetWeather extends AsyncTask<String,Void,List>{ @Override protected List doInBackground(String... params) { return HttpUtil.doGetXml(params[0]); } @Override protected void onPostExecute(List list) { int[] img=new int[32]; img[0]=R.mipmap.a; img[1]=R.mipmap.b; img[2]=R.mipmap.c; img[3]=R.mipmap.d; img[4]=R.mipmap.e; img[5]=R.mipmap.f; img[6]=R.mipmap.g; img[7]=R.mipmap.h; img[8]=R.mipmap.i; img[9]=R.mipmap.j; img[10]=R.mipmap.k; img[11]=R.mipmap.l; img[12]=R.mipmap.m; img[13]=R.mipmap.n; img[14]=R.mipmap.o; img[15]=R.mipmap.p; img[16]=R.mipmap.q; img[17]=R.mipmap.r; img[18]=R.mipmap.s; img[19]=R.mipmap.t; img[20]=R.mipmap.u; img[21]=R.mipmap.v; img[22]=R.mipmap.w; img[23]=R.mipmap.x; img[24]=R.mipmap.y; img[25]=R.mipmap.z; img[26]=R.mipmap.aa; img[27]=R.mipmap.bb; img[28]=R.mipmap.cc; img[29]=R.mipmap.dd; img[30]=R.mipmap.ee; img[31]=R.mipmap.ff; super.onPostExecute(list); if(list!=null&&list.size()>0){ StringBuilder sbd=new StringBuilder(); Log.d("===listsize",""+list.size()); int n=0; for(int i=0;i<list.size();i++){ String wea=list.get(i).toString(); if(wea.contains("gif")){ int index=wea.indexOf("."); Log.d("===index",""+index); int k=Integer.parseInt(wea.substring(0,index)); iv[n++].setImageResource(img[k]); }else if(i==10){ tv.setText(wea); }else if(i==12){ tv1.setText(wea); }else if(i==14){ tv2.setText(wea); }else if(i==20){ tv0.setText(wea); }else if(i==26){ tv3.setText(wea); }else if(i==24){ tv4.setText(wea); }else if(i==36){ tv5.setText(wea); }else if(i==34){ tv6.setText(wea); } } } } }}
- 解析xml用到的代码:PullXmlUtil.java
public class PullXmlUtil { private InputStream is; public PullXmlUtil(InputStream is){ this.is=is; } public List getAllElement() throws XmlPullParserException, IOException { List myData=null; XmlPullParserFactory factory=XmlPullParserFactory.newInstance(); XmlPullParser xpp=factory.newPullParser(); xpp.setInput(is,"UTF-8"); int eventType=xpp.getEventType(); String elementName=""; while(eventType!=XmlPullParser.END_DOCUMENT){ switch (eventType){ case XmlPullParser.START_DOCUMENT: myData=new ArrayList(); break; case XmlPullParser.START_TAG: elementName=xpp.getName(); break; case XmlPullParser.TEXT: if(elementName.equals("string")) myData.add(xpp.getText()); break; case XmlPullParser.END_TAG: break; } eventType=xpp.next(); } return myData; }}
- 连接网络用到的代码:HttpUtile.java
public class HttpUtil { public static List doGetXml(String u){ HttpURLConnection con=null; InputStream is=null; List list=null; try { URL url=new URL(u); con= (HttpURLConnection) url.openConnection(); con.setConnectTimeout(5*1000); //设置超时时间 con.setReadTimeout(5*1000); //设置读取时间 if(con.getResponseCode()==200){ //判断是否连接成功 is=con.getInputStream(); //获取输入 PullXmlUtil pullXmlUtil=new PullXmlUtil(is); try { list=pullXmlUtil.getAllElement(); } catch (XmlPullParserException e) { e.printStackTrace(); } } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if(is!=null){ is.close(); } if(con!=null){ con.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return list; }}
更多相关文章
- 初窥图像处理利器RenderScript
- 在代码中获取Android(安卓)theme中的attr属性值
- 数据解析
- Android(安卓)Studio代码调试技巧篇
- android Intent用法归纳
- Android开发 Handler+ExecutorService(线程池)+MessageQueue模式
- Kotlin 风险高、RxJava 已过时,Android(安卓)原生开发现状分析!
- Android(安卓)设置图片 Bitmap任意透明度
- Android中的AOP