Androidstudio开发,天气预报APP

1.项目功能思维导图

在这里插入图片描述

2. 项目涉及到的技术点

  1. 数据来源:和风天气API
  2. 使用okhttp网络请求框架获取api数据
  3. 使用gson库解析json数据
  4. 使用RecyclerView+adapter实现未来7天列表展示和天气指数
  5. 使用PopupMenu 实现弹出选项框
  6. 使用动画+定时器实现欢迎页倒计时和logo动画
  7. 使用TextToSpeech 实现语音播报

3.项目截图

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

4.部分代码功能实现

  1. 欢迎页实现
public class WelcomeActivity extends AppCompatActivity {private TextView tvCountdown;private CardView card_logo;private CountDownTimer countDownTimer;private long timeLeftInMillis = 1000; // 设置倒计时时长,单位为毫秒@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_welcome);//初始化控件tvCountdown = findViewById(R.id.tv_countdown);card_logo = findViewById(R.id.card_logo);// 启动倒计时startCountdown();//实现logo缩放动画startAnim();}private void startAnim() {ViewCompat.animate(card_logo).scaleX(1.0f).scaleY(1.0f).setDuration(1000).setListener(new ViewPropertyAnimatorListener() {@Overridepublic void onAnimationStart(View view) {}@Overridepublic void onAnimationEnd(View view) {}@Overridepublic void onAnimationCancel(View view) {}}).start();}private void startCountdown() {countDownTimer = new CountDownTimer(timeLeftInMillis, 1000) {@Overridepublic void onTick(long millisUntilFinished) {timeLeftInMillis = millisUntilFinished;int secondsRemaining = (int) (millisUntilFinished / 1000);tvCountdown.setText(secondsRemaining + "s | 跳转");}@Overridepublic void onFinish() {//跳转到登录页面(看自己逻辑想跳转哪个页面)startActivity(new Intent(WelcomeActivity.this, MainActivity.class));// 倒计时结束后的操作,例如跳转到主页面finish();}}.start();}@Overrideprotected void onDestroy() {super.onDestroy();if (countDownTimer != null) {countDownTimer.cancel();}}
}
  1. 天气指数
public class IndicesActivity extends AppCompatActivity {private String city_id;private RecyclerView recyclerView;private IndicesListAdapter mIndicesListAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_indices);//获取跳转传值city_id = getIntent().getStringExtra("city_id");//获取生活指数getWeatherIndices(city_id);//初始化控件initViews();//初始化适配器mIndicesListAdapter = new IndicesListAdapter();//设置适配器recyclerView.setAdapter(mIndicesListAdapter);//设置监听器setListener();}/*** 初始化控件*/private void initViews() {recyclerView = findViewById(R.id.recyclerView);}/*** 设置监听器*/private void setListener() {findViewById(R.id.toolbar).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {finish();}});}/*** 获取生活指数*/private void getWeatherIndices(String city_id) {OkGo.<String>get("https://devapi.qweather.com/v7/indices/1d").params("location", city_id).params("key", ApiConstants.APP_KEY).params("type", "0").execute(new StringCallback() {@Overridepublic void onStart(Request<String, ? extends Request> request) {super.onStart(request);ProgressDialogUtils.showProgressDialog(IndicesActivity.this);}@Overridepublic void onSuccess(Response<String> response) {IndicesInfo indicesInfo = new Gson().fromJson(response.body(), IndicesInfo.class);if (null != indicesInfo && indicesInfo.getCode().equals("200")) {mIndicesListAdapter.setIndicesInfoList(indicesInfo.getDaily());}}@Overridepublic void onFinish() {super.onFinish();ProgressDialogUtils.hideProgressDialog();}});}
}
  1. 城市搜索
public class SearchActivity extends AppCompatActivity {private EditText et_search_city;private RecyclerView recyclerView;private LinearLayoutCompat ll_empty;private SearchListAdapter mSearchListAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_search);// 1. 初始化控件initViews();//创建适配器mSearchListAdapter = new SearchListAdapter();//设置适配器recyclerView.setAdapter(mSearchListAdapter);// 2. 点击事件setListener();}/*** 初始化控件*/private void initViews() {et_search_city = findViewById(R.id.et_search_city);recyclerView = findViewById(R.id.recyclerView);ll_empty = findViewById(R.id.ll_empty);}/*** 点击事件*/private void setListener() {findViewById(R.id.btn_search).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// 1. 获取输入框的值String cityName = et_search_city.getText().toString().trim();// 2. 判断是否为空if (cityName.isEmpty()) {// 提示用户Toast.makeText(SearchActivity.this, "城市名不能为空", Toast.LENGTH_SHORT).show();} else {searchCity(cityName);}}});//返回findViewById(R.id.toolbar).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {finish();}});//recyclerView点击事件mSearchListAdapter.setOnItemClickListener(new SearchListAdapter.OnItemClickListener() {@Overridepublic void onItemClick(CityLocationInfo.LocationDTO locationDTO) {// 1. 获取城市名String cityName = locationDTO.getName();Intent intent = new Intent();intent.putExtra("cityName", cityName);intent.putExtra("id", locationDTO.getId());//设置跳转回传的值setResult(1000, intent);// 3. 关闭当前界面finish();}});}/*** 城市搜索*/private void searchCity(String cityName) {OkGo.<String>get("https://geoapi.qweather.com/v2/city/lookup").params("location", cityName).params("key", ApiConstants.APP_KEY).execute(new StringCallback() {@Overridepublic void onStart(Request<String, ? extends Request> request) {super.onStart(request);ProgressDialogUtils.showProgressDialog(SearchActivity.this);}@Overridepublic void onSuccess(Response<String> response) {CityLocationInfo cityLocationInfo = new Gson().fromJson(response.body(), CityLocationInfo.class);if (null != cityLocationInfo && cityLocationInfo.getCode().equals("200")) {if (null != mSearchListAdapter) {mSearchListAdapter.setCityLocationInfoList(cityLocationInfo.getLocation());}//判断是否显示空布局if (mSearchListAdapter.getItemCount() > 0) {ll_empty.setVisibility(View.GONE);} else {ll_empty.setVisibility(View.VISIBLE);}} else {Toast.makeText(SearchActivity.this, "未查询到该城市", Toast.LENGTH_SHORT).show();}}@Overridepublic void onError(Response<String> response) {super.onError(response);}@Overridepublic void onFinish() {super.onFinish();ProgressDialogUtils.hideProgressDialog();}});}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web 网络安全

Web网络安全是网络安全的一个重要分支&#xff0c;专注于保护Web应用程序、服务和网站免受各种网络威胁。学习Web网络安全涉及多个层面的知识和技能&#xff0c;以下是一些主要的学习领域&#xff1a; 一、XSS攻击 全称:&#xff1a;Cross Site Script &#xff08;跨站脚本&a…

在vue3中,手写父子关联,勾选子级父级关联,取消只取消当前子级,父节点不动

树形控件选择子级勾选父级&#xff0c;以及所有子级&#xff0c; 取消勾选仅取消子级 在项目中&#xff0c;可能会遇到这种场景&#xff0c;比如权限配置的时候&#xff0c;页面权限和菜单权限以tree的形式来配置&#xff0c;而且不用半选&#xff0c;菜单在页面的下面&#xf…

FTP与TFTP

1、TFTP&#xff08;简单文件传输协议&#xff09; TFTP是TCP/IP协议族中一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。 基于UDP协议 端口号&#xff1a;69 特点&#xff1a;简单、轻量级、易于实现 传输过程&…

人与机器的协同是强弱系统的互补行为

人与机器的协同可以被视作强弱系统的互补行为&#xff0c;这也强调了人类和机器之间在处理问题、执行任务或创造价值时各自的优势与角色。 人类在认知、创造力、情感和伦理等方面具有独特优势。我们能够进行高级的抽象思维、创新和复杂决策&#xff0c;能够处理不确定性和动态环…

《Windows API每日一练》9.13资源-鼠标位图和字符串

鼠标指针位图&#xff08;Mouse Cursor Bitmap&#xff09;是用于表示鼠标指针外观的图像。在 Windows 窗口编程中&#xff0c;可以使用自定义的鼠标指针位图来改变鼠标的外观&#xff0c;并提供更加个性化的用户体验。 ■以下是一些与鼠标指针位图相关的要点&#xff1a; ●…

量产工具一一业务系统(六)

目录 前言 一、代码流程框架 1.业务系统程序流程图 2.业务系统主页面流程图 3.main.c 4.main_page.c 二、处理配置文件 1.配置文件示例 2.处理配置文件 3.config.h 4.config.c 三、生成产品界面 1.计算每个按钮的范围 2.main_page.c 四、处理输入事件 1.main_…

【Python实战因果推断】18_线性回归的不合理效果8

目录 Saturated Regression Model Regression as Variance Weighted Average Saturated Regression Model 还记得我在本章开头强调回归和条件平均值之间的相似性吗&#xff1f;我向你展示了使用二元干预进行回归与比较干预组和对照组的平均值是完全一样的。现在&#xff0c;由…

Python | Leetcode Python题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack:def __init__(self):"""Initialize your data structure here."""self.queue collections.deque()def push(self, x: int) -> None:"""Push element x onto stack."&…

LabVIEW机器视觉技术在产品质量检测中有哪些应用实例

LabVIEW的机器视觉技术在产品质量检测中有广泛的应用&#xff0c;通过图像采集、处理和分析&#xff0c;实现对产品缺陷的自动检测、尺寸测量和定位校准&#xff0c;提高生产效率和产品质量。 1. 电子元器件质量检测 在电子制造业中&#xff0c;电子元器件的质量检测是确保产品…

【基于深度学习方法的激光雷达点云配准系列之GeoTransformer】——粗配准

【GeoTransformer系列】——粗配准 1.coarse_matching1.1 概要1.2 功能1.3 超参1.4 input1.5 output2 coarse_target2.1 概要2.2 功能2.3 input2.4 output在模型部分有了初步了解之后, 接下来我们对后续的粗配准、精配准等部分依次进行解读. 本篇主要来看粗配准部分, 代码是在G…

websocket推送消息,模拟推送

上一篇文章&#xff1a;什么是webSocket&#xff1f;以及它的一些相关理论知识 背景&#xff1a; MQTT 的发布/订阅模式与 WebSocket 的双向通信特性相结合。 通过将 MQTT 与 WebSocket 结合使用&#xff0c;可以在 Web 应用中实现高效、实时的消息传输&#xff0c;特别适用于…

24/7/10总结

flex布局 父项常见属性 justify-content:设置主轴上的子元素排列方式 flex-wrap:设置子元素是否换行 align-items:设置侧轴上的子元素的排列方式&#xff08;单行&#xff09; 拉伸要把子盒子里的高度给去掉 如果两个align-items都是center并且主轴是y轴就是这种效果…

Java | Leetcode Java题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack {Queue<Integer> queue;/** Initialize your data structure here. */public MyStack() {queue new LinkedList<Integer>();}/** Push element x onto stack. */public void push(int x) {int n queue.size();…

操作系统:信号究竟是什么?如何产生?

OS信号 一、信号的概念二、信号的产生1&#xff09;终端按键产生信号1、 前台进程、后台进程2、验证终端按键是否产生信号 2&#xff09;调用系统函数向进程发信号3&#xff09;硬件异常产生信号1、浮点数溢出&#xff0c;CPU产生信号2 浮点数溢出&#xff0c;产生信号原理3. 空…

Mysql-内置函数

一.什么是函数&#xff1f; 函数是指一段可以直接被另外一段程序调用的程序或代码。 mysql内置了很多的函数,我们只需要调用即可。 二.字符串函数 MySQL中内置了很多字符串函数: 三.根据需求完成以下SQL编写 由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全…

windows驱动开发基础-环境篇

前言 Windows上无论是用户模式下还是内核模式下&#xff0c;有关驱动的开发都有可能影响系统稳定性&#xff0c;所以我们首先要准备一个专用的测试环境&#xff0c;可以使用VM等虚拟机方便环境修复和还原 测试模式 开启测试模式&#xff1a;cmd 命令 bcdedit /set testsign…

旷野之间2 - 如何训练医疗保健小型语言模型(AI-SLM)

​​​​ 在本文中,我们将研究如何针对疾病症状训练一个小型医疗保健语言模型。为此,我们将从HuggingFace获取数据集(用于训练我们的模型):https://huggingface.co/datasets/QuyenAnhDE/Diseases_Symptoms QuyenAnhDE/Diseases_Symptoms 数据集来自 Hugging Face。图片来源…

6.MkDocs附录

安装插件 在 MkDocs 中&#xff0c;插件通常是通过 pip​ 工具安装的。你可以使用以下步骤来安装和配置 MkDocs 插件。 1.使用 pip​ 命令安装你需要的插件。例如 pip install pymdown-extensions‍ 2.更新 mkdocs.yml​ 文件。 ‍ 3.使用 mkdocs serve​ 命令本地预览你…

CentOS6禁止锁屏

在电源中设置后还是会锁屏, 原因是有屏幕保护程序 电源管理都 “从不” 一些AI的回答 在CentOS 6系统中&#xff0c;如果你想要禁用锁屏功能&#xff0c;可以编辑/etc/kbd/config文件。这个文件通常包含了键盘相关的设置&#xff0c;包括密码策略和屏幕锁定选项。 首先打开终…

支持向量机 (support vector machine,SVM)

支持向量机 &#xff08;support vector machine&#xff0c;SVM&#xff09; flyfish 支持向量机是一种用于分类和回归的机器学习模型。在分类任务中&#xff0c;SVM试图找到一个最佳的分隔超平面&#xff0c;使得不同类别的数据点在空间中被尽可能宽的间隔分开。 超平面方…