android studio开发天气预报小程序代码实现
时间: 2023-06-29 18:07:22 浏览: 211
Android Studio 开发天气预报小程序代码实现需要以下步骤:
1. 创建一个新的 Android Studio 项目,命名为 WeatherForecast。
2. 在项目中创建一个 Activity,命名为 MainActivity。
3. 在 MainActivity 的布局文件中添加一个 EditText 和一个 Button,用于输入城市名称和搜索天气预报。
4. 在 MainActivity 中定义一个 Retrofit 实例和一个接口,用于从天气 API 中获取数据。
5. 在 MainActivity 中添加一个方法,用于处理 Button 的点击事件,获取城市名称并调用 Retrofit 接口获取天气数据。
6. 创建一个 Weather 类,用于存储天气数据。
7. 在 MainActivity 中添加一个方法,用于解析从 API 中获取的 JSON 数据,并将其存储在 Weather 对象中。
8. 在 MainActivity 中添加一个方法,用于将 Weather 数据显示在屏幕上。
下面是一个简单的实现示例:
1. 创建一个新的 Android Studio 项目,命名为 WeatherForecast。
2. 在项目中创建一个 Activity,命名为 MainActivity。
3. 在 MainActivity 的布局文件中添加一个 EditText 和一个 Button,用于输入城市名称和搜索天气预报。
activity_main.xml:
```
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/cityEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter city name"/>
<Button
android:id="@+id/searchButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Search"/>
</LinearLayout>
```
4. 在 MainActivity 中定义一个 Retrofit 实例和一个接口,用于从天气 API 中获取数据。
MainActivity.java:
```
public class MainActivity extends AppCompatActivity {
private EditText cityEditText;
private Button searchButton;
private TextView weatherTextView;
private Retrofit retrofit;
private WeatherApi weatherApi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cityEditText = findViewById(R.id.cityEditText);
searchButton = findViewById(R.id.searchButton);
weatherTextView = findViewById(R.id.weatherTextView);
retrofit = new Retrofit.Builder()
.baseUrl("https://api.openweathermap.org/")
.addConverterFactory(GsonConverterFactory.create())
.build();
weatherApi = retrofit.create(WeatherApi.class);
searchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String city = cityEditText.getText().toString();
getWeather(city);
}
});
}
private void getWeather(String city) {
Call<WeatherResponse> call = weatherApi.getWeather(city, "YOUR_API_KEY");
call.enqueue(new Callback<WeatherResponse>() {
@Override
public void onResponse(Call<WeatherResponse> call, Response<WeatherResponse> response) {
if (response.isSuccessful()) {
WeatherResponse weatherResponse = response.body();
Weather weather = new Weather(weatherResponse);
showWeather(weather);
} else {
Toast.makeText(MainActivity.this, "Error: " + response.message(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<WeatherResponse> call, Throwable t) {
Toast.makeText(MainActivity.this, "Error: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
private void showWeather(Weather weather) {
weatherTextView.setText("Temperature: " + weather.getTemperature() + "\n" +
"Description: " + weather.getDescription());
}
}
interface WeatherApi {
@GET("data/2.5/weather")
Call<WeatherResponse> getWeather(@Query("q") String city, @Query("appid") String apiKey);
}
class WeatherResponse {
@SerializedName("main")
private Main main;
@SerializedName("weather")
private List<WeatherInfo> weatherInfoList;
Main getMain() {
return main;
}
List<WeatherInfo> getWeatherInfoList() {
return weatherInfoList;
}
}
class Main {
@SerializedName("temp")
private double temperature;
double getTemperature() {
return temperature;
}
}
class WeatherInfo {
@SerializedName("description")
private String description;
String getDescription() {
return description;
}
}
class Weather {
private double temperature;
private String description;
Weather(WeatherResponse response) {
temperature = response.getMain().getTemperature();
description = response.getWeatherInfoList().get(0).getDescription();
}
double getTemperature() {
return temperature;
}
String getDescription() {
return description;
}
}
```
5. 在 MainActivity 中添加一个方法,用于处理 Button 的点击事件,获取城市名称并调用 Retrofit 接口获取天气数据。
```
searchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String city = cityEditText.getText().toString();
getWeather(city);
}
});
```
6. 创建一个 Weather 类,用于存储天气数据。
```
class Weather {
private double temperature;
private String description;
Weather(WeatherResponse response) {
temperature = response.getMain().getTemperature();
description = response.getWeatherInfoList().get(0).getDescription();
}
double getTemperature() {
return temperature;
}
String getDescription() {
return description;
}
}
```
7. 在 MainActivity 中添加一个方法,用于解析从 API 中获取的 JSON 数据,并将其存储在 Weather 对象中。
```
private void getWeather(String city) {
Call<WeatherResponse> call = weatherApi.getWeather(city, "YOUR_API_KEY");
call.enqueue(new Callback<WeatherResponse>() {
@Override
public void onResponse(Call<WeatherResponse> call, Response<WeatherResponse> response) {
if (response.isSuccessful()) {
WeatherResponse weatherResponse = response.body();
Weather weather = new Weather(weatherResponse);
showWeather(weather);
} else {
Toast.makeText(MainActivity.this, "Error: " + response.message(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<WeatherResponse> call, Throwable t) {
Toast.makeText(MainActivity.this, "Error: " + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
```
8. 在 MainActivity 中添加一个方法,用于将 Weather 数据显示在屏幕上。
```
private void showWeather(Weather weather) {
weatherTextView.setText("Temperature: " + weather.getTemperature() + "\n" +
"Description: " + weather.getDescription());
}
```
注意:在使用该示例代码前,需要替换 YOUR_API_KEY 为你自己的天气 API 密钥。
阅读全文