Practical drill-weather forecast program
(If you have any questions, you can comment and communicate together)
1. Create the program
2. After the creation is complete, design the user interface.
Edit the activity_main.xml file: (code is as follows)
<?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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/weather02"
tools:context="com.example.weather.MainActivity">
<TextView
android:id="@+id/tv_city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/tv_weather"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/tv_weather"
android:layout_marginTop="39dp"
android:text="上海"
android:textSize="50sp"/>
<ImageView
android:id="@+id/iv_icon"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_alignLeft="@+id/ll_btn"
android:layout_alignStart="@+id/ll_btn"
android:layout_below="@+id/tv_city"
android:layout_marginLeft="44dp"
android:layout_marginStart="44dp"
android:layout_marginTop="42dp"
android:paddingBottom="5dp"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/tv_weather"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/iv_icon"
android:layout_below="@+id/iv_icon"
android:layout_marginRight="15dp"
android:layout_marginTop="18dp"
android:gravity="center"
android:text="多云"
android:textSize="18sp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/iv_icon"
android:layout_marginLeft="39dp"
android:layout_marginStart="39dp"
android:layout_toEndOf="@+id/iv_icon"
android:layout_toRightOf="@+id/iv_icon"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tv_temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_vertical"
android:text="- 7 ℃"
android:textSize="22sp" />
<TextView
android:id="@+id/tv_wind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="风力:3级"
android:textSize="18sp" />
<TextView
android:id="@+id/tv_pm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="pm"
android:textSize="18sp"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/cardview_compat_inset_shadow"
android:text="石周斗专属"/>
<LinearLayout
android:id="@+id/ll_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:orientation="horizontal">
<Button
android:id="@+id/btn_bj"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="北京"/>
<Button
android:id="@+id/btn_sh"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上海"/>
<Button
android:id="@+id/btn_gz"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广州"/>
</LinearLayout>
</RelativeLayout>
2. Create a folder raw (created in res)
3. After the raw folder is created successfully, create a weather1.xml file in it (this file contains some weather information) The
weather.xml code is as follows:
<?xml version="1.0" encoding="utf-8"?>
<infos>
<city id="sh">
<temp>20`C/30`C</temp>
<weather>晴转多云</weather>
<name>上海</name>
<pm>80</pm>
<wind>1级</wind>
</city>
<city id="bj">
<temp>26`C/32`C</temp>
<weather>晴</weather>
<name>北京</name>
<pm>98</pm>
<wind>3级</wind>
</city>
<city id="gz">
<temp>15`C/24`C</temp>
<weather>多云</weather>
<name>广州</name>
<pm>30</pm>
<wind>5级</wind>
</city>
</infos>
4. Create the WeatherInfo class (in order to facilitate the use of the attributes in weather.xml, encapsulated into a class), create the WeatherInfo class, the specific code is as follows:
package com.example.weather;
public class WeatherInfo {
private String id;
private String temp;
private String weather;
private String name;
private String pm;
private String wind;
public String getId(){
return id;
}
public void setId(String id){
this.id=id;
}
public String getTemp(){
return temp;
}
public void setTemp(String temp){
this.temp=temp;
}
public String getWeather(){
return weather;
}
public void setWeather(String weather){
this.weather=weather;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getPm(){
return pm;
}
public void setPm(String pm){
this.pm=pm;
}
public String getWind(){
return wind;
}
public void setWind(String wind){
this.wind=wind;
}
}
5. Create a WeatherService tool class (in order to make the code easier to read, avoid a lot of code in one class, so create a tool class WeatherService for parsing XML files).
The specific code is as follows:
package com.example.weather;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class WeatherService {
public static List<WeatherInfo> getInfsFromXML (InputStream is) throws Exception{
XmlPullParser parser= Xml.newPullParser();
parser.setInput(is,"utf-8");
List<WeatherInfo> weatherInfos=null;
WeatherInfo weatherInfo =null;
int type =parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT){
switch (type){
case XmlPullParser.START_TAG:
if ("infos".equals(parser.getName())){
weatherInfos= new ArrayList<WeatherInfo>();
}else if ("city".equals(parser.getName())){
weatherInfo =new WeatherInfo();
String idStr =parser.getAttributeValue(0);
weatherInfo.setId(idStr);
}else if ("temp".equals(parser.getName())){
String temp=parser.nextText();
weatherInfo.setTemp(temp);
}else if ("weather".equals(parser.getName())){
String weather =parser.nextText();
weatherInfo.setWeather(weather);
}else if ("name".equals(parser.getName())){
String name =parser.nextText();
weatherInfo.setName(name);
}else if ("pm".equals(parser.getName())){
String pm=parser.nextText();
weatherInfo.setPm(pm);
}else if ("wind".equals(parser.getName())){
String wind =parser.nextText();
weatherInfo.setWind(wind);
}
break;
case XmlPullParser.END_TAG:
if ("city".equals(parser.getName())){
weatherInfos.add(weatherInfo);
weatherInfo=null;
}
break;
}
type=parser.next();
}
return weatherInfos;
}
}
6. Write interface interaction code (In MainActivity.java, the data in the parsed weather1.xml file needs to be displayed in the text control). The specific code is as follows:
package com.example.weather;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView tvCity;
private TextView tvWeather;
private TextView tvTemp;
private TextView tvWind;
private TextView tvpm;
private ImageView ivIcon;
private Map<String,String> map;
private List<Map<String,String>> list;
private String temp,weather,name,pm,wind;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intView();
try {
InputStream is=this.getResources().openRawResource(R.raw.weather1);
List<WeatherInfo> weatherInfos=WeatherService.getInfsFromXML(is);
list =new ArrayList<Map<String,String>>();
for (WeatherInfo info:weatherInfos){
map=new HashMap<String, String>();
map.put("temp",info.getTemp());
map.put("weather",info.getWeather());
map.put("name",info.getName());
map.put("pm",info.getPm());
map.put("wind",info.getWind());
list.add(map);
}
} catch (Exception e){
e.printStackTrace();
Toast.makeText(this,"解析信息失败",Toast.LENGTH_SHORT).show();
}
getMap(1,R.drawable.sun);
}
private void intView(){
tvCity =(TextView) findViewById(R.id.tv_city);
tvWeather=(TextView) findViewById(R.id.tv_weather);
tvTemp=(TextView) findViewById(R.id.tv_temp);
tvWind=(TextView) findViewById(R.id.tv_wind);
tvpm=(TextView) findViewById(R.id.tv_pm);
ivIcon =(ImageView) findViewById(R.id.iv_icon);
findViewById(R.id.btn_sh).setOnClickListener(this);
findViewById(R.id.btn_gz).setOnClickListener(this);
findViewById(R.id.btn_bj).setOnClickListener(this);
}
public void onClick(View v){
switch (v.getId()){
case R.id.btn_sh:
getMap(0,R.drawable.cloud_sun1);
break;
case R.id.btn_bj:
getMap(1,R.drawable.sun);
break;
case R.id.btn_gz:
getMap(2,R.drawable.clouds);
break;
}
}
private void getMap(int number,int iconNumber){
Map<String,String> cityMap=list.get(number);
temp=cityMap.get("temp");
weather=cityMap.get("weather");
name=cityMap.get("name");
pm=cityMap.get("pm");
wind=cityMap.get("wind");
tvCity.setText(name);
tvWeather.setText(weather);
tvTemp.setText(""+temp);
tvWind.setText("风力:"+wind);
tvpm.setText("pm:"+pm);
ivIcon.setImageResource(iconNumber);
}
}
7. Run the program (when running the program, the single "Beijing", "Shanghai", and "Guangzhou" buttons can display weather information of different cities), the running program I did is as follows:
Summary:
The following is what I did Actual combat drills.
Note: We need to use some pictures when we make them. If we do, we can search the internet by ourselves and just like it ourselves. Download it, then copy and paste it into our Android studio, just copy and paste it directly. But when we do it, we must pay attention to the naming of some pictures, otherwise an error will be reported. If you don’t understand anything, you can communicate with each other, private message or comment, I will reply in time when I see the message, I am just starting out, and learn together!