目录
一、测试环境说明
电脑环境
Windows 11
编写语言
JAVA
开发软件
Android Studio (2020)
开发软件只要大于等于测试版本即可(近几年官网直接下载也可以),若是版本低于测试版本请自行测试。项目需要根据你的软件自行适配
二、项目简介
本天气预报APP的开发涉及多项关键技术点,涵盖了Android开发的多个核心领域。
首先,采用Android Studio作为开发环境,结合Java语言实现业务逻辑,充分利用其成熟的生态和丰富的类库支持。
数据获取方面,通过OkHttp进行网络请求,从天气API异步获取JSON格式数据,并利用Gson进行解析,确保数据的高效加载与更新。
本地数据存储采用SQLite数据库,管理用户关注的城市信息及个性化设置,支持增删改查操作。
架构设计上,采用MVC模式分离数据、视图与控制逻辑,提高代码的可维护性。UI层面遵循Material Design规范,实现响应式布局,适配不同屏幕尺寸,并通过动态主题切换增强用户体验。
三、项目演示
网络资源模板--基于Android studio 天气预报App
四、部设计详情(部分)
首页
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_out_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary">
<RelativeLayout
android:id="@+id/main_bottom_layout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentTop="true"
android:layout_marginTop="0dp">
<ImageView
android:id="@+id/main_iv_add"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:src="@mipmap/icon_add"
android:padding="12dp"/>
<ImageView
android:id="@+id/main_iv_more"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:src="@mipmap/icon_more"
android:padding="12dp"/>
<LinearLayout
android:id="@+id/main_layout_point"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="horizontal"></LinearLayout>
</RelativeLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/main_vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/main_bottom_layout">
</androidx.viewpager.widget.ViewPager>
</RelativeLayout>
1. 页面的结构
该页面采用RelativeLayout作为根布局,整体分为上下两部分。顶部是一个横向的RelativeLayout,包含左右两个功能按钮(添加城市和更多设置)以及中间的小圆点指示器。
下方是一个ViewPager,用于展示不同城市的天气信息,支持左右滑动切换城市。页面结构清晰,顶部导航栏与主内容区域分离,符合常见的移动应用布局规范,确保用户操作便捷性和视觉舒适度。
2. 使用到的技术
该页面主要运用了Android ViewPager实现多城市天气的滑动切换,并结合Fragment动态加载不同城市的天气数据。
顶部导航栏采用ImageView作为功能按钮,并通过SharedPreferences存储用户选择的背景主题。
数据库操作使用SQLite管理城市列表,确保数据的持久化存储。此外,通过OnPageChangeListener监听ViewPager滑动事件,动态更新小圆点指示器,增强交互体验。
3. 页面详细介绍
该页面是天气预报应用的主界面,核心功能是展示多个城市的天气信息。用户可通过ViewPager左右滑动浏览不同城市的天气,顶部的小圆点指示器实时显示当前所在页面。
点击“添加”按钮可跳转至城市管理页,新增或删除关注城市;点击“更多”按钮则进入设置页调整主题或查看其他功能。
页面背景支持动态切换,提升个性化体验。整体设计简洁直观,确保用户能快速获取天气信息并执行相关操作。
城市管理页
package com.example.weather.city_manager;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
import com.example.weather.R;
import com.example.weather.db.DBManager;
import com.example.weather.db.DatabaseBean;
import java.util.ArrayList;
import java.util.List;
import androidx.appcompat.app.AppCompatActivity;
/**
* 城市管理界面
*/
public class CityManagerActivity extends AppCompatActivity implements View.OnClickListener{
ImageView addIv,backIv,deleteIv;
ListView cityLv;
List<DatabaseBean> mDatas; //显示列表数据源
private CityManagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//绑定视图
setContentView(R.layout.activity_city_manager);
//初始化控件
addIv = findViewById(R.id.city_iv_add);
backIv = findViewById(R.id.city_iv_back);
deleteIv = findViewById(R.id.city_iv_delete);
cityLv = findViewById(R.id.city_lv);
mDatas = new ArrayList<>();
// 添加点击监听事件
addIv.setOnClickListener(this);
deleteIv.setOnClickListener(this);
backIv.setOnClickListener(this);
// 设置适配器
adapter = new CityManagerAdapter(this, mDatas);
cityLv.setAdapter(adapter);
}
/* 获取数据库当中真实数据源,添加到原有数据源当中,提示适配器更新*/
@Override
protected void onResume() {
super.onResume();
List<DatabaseBean> list = DBManager.queryAllInfo();
mDatas.clear();//清空
mDatas.addAll(list);//添加所有
adapter.notifyDataSetChanged();//刷新适配器
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.city_iv_add://搜索城市
//获取已添加城市数量
int cityCount = DBManager.getCityCount();
if (cityCount<5) {
Intent intent = new Intent(this, SearchCityActivity.class);
startActivity(intent);
}else {
Toast.makeText(this,"存储城市数量已达上限,请删除后再增加",Toast.LENGTH_SHORT).show();
}
break;
case R.id.city_iv_back://返回
finish();
break;
case R.id.city_iv_delete://删除城市页面
Intent intent1 = new Intent(this, DeleteCityActivity.class);
startActivity(intent1);
break;
}
}
}
1. 页面的结构
该模块主要包含城市管理功能,由三个核心类组成:DeleteCityActivity(删除城市界面)、DeleteCityAdapter(删除城市列表适配器)和CityManagerAdapter(城市管理列表适配器)。
删除城市界面采用ListView展示所有已关注城市,每行提供删除按钮,顶部有确认和取消操作按钮。城市管理界面同样使用ListView,但仅展示城市名称和当前温度,数据来源于本地数据库。
整体采用经典的列表式布局,符合用户对城市管理功能的操作预期。
2. 使用到的技术
该模块基于BaseAdapter实现自定义列表适配器,支持动态数据绑定和视图复用。通过SQLite数据库(DBManager)管理城市数据的增删改查,结合Gson解析天气JSON数据。
交互方面,采用AlertDialog实现删除前的二次确认,提升操作安全性。
时间格式化使用SimpleDateFormat,确保数据展示规范。列表项点击事件通过ViewHolder模式优化性能,避免重复查找控件。
3. 页面详细介绍
DeleteCityActivity提供城市删除功能,用户可通过每行右侧的删除按钮选择待移除城市,点击顶部确认按钮批量执行数据库删除操作,取消按钮则触发对话框提示。
CityManagerAdapter负责城市管理界面的数据展示,从数据库获取城市名称及实时温度,并利用Gson解析天气数据。
两页面均采用高效适配器模式,确保列表滑动流畅,同时通过数据库操作保证数据的实时性和一致性,满足用户对多城市管理的核心需求。
五、项目源码
👇👇👇👇👇快捷方式👇👇👇👇👇