Android中WebView的交互细节天气可视化Demo实战

Android实战--天气预报(API+JSON解析) 学习安卓有一段时间了,应该提高自己的实战能力,做一些简单的Demo。下面我们介绍一下如何利用网络API实现天气预报功能,主要涉及到如何利用API获得网络数据,网络数据返回一般是JSON格式,这里又涉及到JSON的解析问题,这些都是比较基础的问题,应该予以掌握。 首先在http://apistore.baidu.com/?qq-pf-to=pcqq.c2c找到你想要的API,这里我们选择http: 阅读详情

Android使用WebView交互

Android使用webView细节



前言

android中使用WebView细节繁多,特此记录一个天气可视化折线图,android端使用WebView加载前端H5页面,可视化工具使用Echarts ,api使用聚合天气


一、android端与WebView交互

1.android调用前端方法

编写布局 ProgressBar为进度条,可省略

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ProgressBar
        android:layout_width="match_parent"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:id="@+id/chart_bar"
        android:layout_height="10dp"/>
<WebView
    android:layout_width="match_parent"
    android:id="@+id/fragment_webview"
    android:layout_height="match_parent"/>

</LinearLayout>

H5中编写一个测试方法供android端调用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
</body>
<script>

      /* 无参调用 */
    function notParamFun() {
        alert("网页方法被调用");
    }
    
    /* 有参调用 */
    function haveParamtestFun(data) {
        alert("接收到android端的数据:" + data);
    }
</script>
</html>

注意:编写好的HTML网页需要放入android 项目中的assets中,assets需要手动新建。
在这里插入图片描述


android 中java代码,注意loadUrl中是asset,且发送数据必须等待网页加载完(newProgress =100)才能进行交互并且只能传输字符串形式。
且需要加入单引号

 	private ProgressBar chartBar;
    private WebView fragmentWebview;
    
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
         chartBar = (ProgressBar) view.findViewById(R.id.chart_bar);
        fragmentWebview = (WebView) view.findViewById(R.id.fragment_webview);


        /*前端接口*/
        fragmentWebview.addJavascriptInterface(this, "myWebView");
        fragmentWebview.loadUrl("file:///android_asset/myWebView.html");
        fragmentWebview.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
//                 当进度达到100时调用H5接口
                if (newProgress == 100) {
                       fragmentWebview.loadUrl("javascript:notParamFun()");
                    fragmentWebview.loadUrl("javascript:haveParamtestFun('"+ "发送String数据" +"')");
                    chartBar.setVisibility(View.GONE);

                } else {
                    chartBar.setVisibility(View.VISIBLE);
                    chartBar.setProgress(newProgress);
                }
            }

        });
    }
        /*前端调用的接口方法*/
    @JavascriptInterface
    public void getData(String title) {
        new AlertDialog.Builder(getContext())
                .setTitle(title)
                .setMessage("前端调用")
                .setPositiveButton("OK", null)
                .create()
                .show();

    }

在这里插入图片描述
在这里插入图片描述

2. 前端H5调用android方法

在android已经写好网页端调用接口对象myWebView,且有一个共前端调用的方法为getData

        /*前端接口对象*/
fragmentWebview.addJavascriptInterface(this, "myWebView");

    /*前端调用的接口方法*/
    @JavascriptInterface
    public void getData(String title) {
        new AlertDialog.Builder(getContext())
                .setTitle(title)
                .setMessage("前端调用")
                .setPositiveButton("OK", null)
                .create()
                .show();

    }

只需在前端加入一行调用代码

<script>
//调用android方法,无参也需要写上()
javascript: myWebView.getData("我是前端的title");
  /* 无参调用 */
    function notParamFun() {
        alert("网页方法被调用");
    }

    /* 有参调用 */
    function haveParamtestFun(data) {
        alert("接收到android端的数据:" + data);
    }
    
</script>

保存重新启动模拟器
在这里插入图片描述

二、编写写天气可视化Demo

1、前端引入Echarts,编写前端布局

注意:stack加上会有堆叠显示问题,最后去掉stack解决堆叠问题

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.staticfile.org/echarts/4.7.0/echarts.min.js"></script>

</head>

<body>
    <div id="myChartPie" style="width: 100%; height: 400px; "></div>
    <div></div>
</body>
<script>
    var echartsPie = echarts.init(document.getElementById("myChartPie"));
    var option = {
        title: {
            text: '武汉天气预报'
        },
        tooltip: {
            trigger: 'axis'
        },
        legend: {
            data: ['最低温度', '最高温度']
        },
        grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
        },
        toolbox: {
            feature: {
                saveAsImage: {}
            }
        },
        xAxis: {
            type: 'category',
            boundaryGap: false,
            data: [],

        },
        yAxis: {
            type: 'value'
        },
        series: [{
                name: '最低温度',
                type: 'line',
                data: [],
                itemStyle: {
                    normal: {
                        color: 'black',
                        borderColor: 'black', //拐点边框颜色
                    }
                },
            }, {
                name: '最高温度',
                type: 'line',
                data: [],
                itemStyle: {
                    normal: {
                        color: 'red',
                        borderColor: 'red', //拐点边框颜色
                    }
                },
            }

        ]
    };
    echartsPie.setOption(option);


    function javacalljs(data) {
        /* 将JSON数据转换为对象 */
        data = JSON.parse(data);
        var weather = data.result.future;
        //时间数组
        var dateArr = [];
        //最低气温数组
        var temLowerArr = [];
        //最高气温数组
        var temHightArr = [];
        //循环遍历添加数据
        weather.forEach(function(item) {
            var tem = item.temperature.toString().replace("℃", "").split("/");
            dateArr.push(item.date);
            temLowerArr.push(tem[0]);
            temHightArr.push(tem[1]);

        });
        option.xAxis.data = dateArr;
        option.series[0].data = temLowerArr;
        option.series[1].data = temHightArr;
		//最后要更新图表
        echartsPie.setOption(option);
    }

</script>

</html>

2.android 端编写布局及交互代码

布局仍然使用上次的xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ProgressBar
        android:layout_width="match_parent"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:id="@+id/chart_bar"
        android:layout_height="10dp"/>
<WebView
    android:layout_width="match_parent"
    android:id="@+id/fragment_webview"
    android:layout_height="match_parent"/>

</LinearLayout>

java 交互代码,api选用聚合天气api,网络框架使用OKHttp



    private ProgressBar chartBar;
    private WebView fragmentWebview;
	private String apiData = "";
	//请求聚合天气API的url
   private final String url = "http://apis.juhe.cn/simpleWeather/query";
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        chartBar = (ProgressBar) view.findViewById(R.id.chart_bar);
        fragmentWebview = (WebView) view.findViewById(R.id.fragment_webview);
         RequestBody body =new FormBody.Builder()
                .add("key", "你申请的key")
                .add("city", "武汉")
                .build();
                    
 OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();



        client.newCall(request).enqueue(new Callback() {
            /*请求失败时的回调*/
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("onFailure: ", e.getMessage());
            }
            /*请求成功时的回调*/
            @Override
            public void onResponse(Call call, Response response) throws IOException {
					apiData = response.body().string();
            }
        });
		
        fragmentWebview.loadUrl("file:///android_asset/myWebView.html");
        fragmentWebview.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
			// 当进度达到100时发送数据
                if (newProgress == 100) {
                    fragmentWebview.loadUrl("javascript:javacalljs('"+ apiData +"')");

                    chartBar.setVisibility(View.GONE);

                } else {
                    chartBar.setVisibility(View.VISIBLE);
                    chartBar.setProgress(newProgress);
                }
            }

        });
        
    }

在这里插入图片描述

Android天气预报丨极简版 文章主要介绍了使用Android开发一个极简版的天气预报的思路与流程。 阅读详情

相关推荐

Android WebView入门教程:简单实现网页展示

我们创建了一个新的Android项目,添加了一个WebView控件到布局文件中,并在MainActivity中编写了代码来加载网页。接下来,我们使用setWebViewClient方法设置一个WebViewClient对象,以便在WebView加载网页时能够在应用程序内部显示网页内容,而不是打开系统默认的浏览器应用程序。在上述代码中,我们首先在MainActivity类中声明了一个WebView变量webView,并在onCreate方法中获取布局文件中的WebView控件实例。步骤4:运行应用程序。

PixelCoder的博客 625

Android获取天气预报Demo

近期在学习Android的时候,做了一个有关天气预报的任务,本文利用Gson解析Json的方式写一个Demo给有需要的朋友作为参考 天气预报来源:和风天气 https://www.heweather.com/documents/api/v5/weather 可以在百度上找到很多提供天气的api,大家只要注册拿到key即可。 天气预报返回示例: { "HeWeather5": [

champion0324的博客 1万+

安卓实现天气预报(通过webView直接显示和OKhttp请求数据显示两种方式)

博客参考https://blog.youkuaiyun.com/hongfei568718926/article/details/109117723

Android 天气APP(一)开发准备

天气APP前言一、开发准备1.数据和思维逻辑2.百度开发者账号申请① 获取应用包名② 获取开发版SHA1③ 获取发布版SHA1 前言 正所谓天有不测风云,所以有一个好的天气是很重要的,在古代,人满看天气都是查时节看天色,在夏商时代,人们已经开始从事农业生产,靠天吃饭的需求,让天气预报成为刚需。不过,当时没有气象科学,人们光靠抬头看天和占卜来观测和预报天气。当然,预报准确率就不得而知了。 在我国最早...

晨曦 3万+

Android天气预报demo

Android天气预报demo:是一个最简单的 http 请求 ,解析返回json,在界面展示的效果。支持动态选择城市

简单天气预报demo

可以切换城市,把代码中隐藏的搜索框显示即可切换,代码很简单

android之后台定时更新ui天气【Timer、service、broadcast、activity】

这个案例只是为了关联各个知识点,在实际开发中还有待优化  项目结构分析: Weather实体类:用来存放我们的天气实体 WeatherManager: 用来操作Weather MainActivity:主acaitivy CityWeatherService:定时轮询来更新前台的信息 原理比较简单直接贴出代码: Weather: package com.example.weathe

yaya_soft的专栏 9462

基于Eclipse的 Android 天气查询的简单demo

项目中使用的一个获取天气的demo,是基于volly库,利用雅虎API接口获取的天气,流程是先获取到本地IP,反查出城市,可以是海外城市,然后通过雅虎接口获取天气,支持7天天气查询,欢迎大家下载使用。

Android MVP (网络请求天气Demo)

MVP(Model — View — Presenter) Model:数据相关层,在该层定义Model.inerface是表示数据层发生变化时的通知接口,因为Model不能与View直接交互,所以需要通过Presenter来间接达到与View的交互; View :视图相关层,在该层定义的View.interface是表示View视图的各种变化,一般由Activity或Fragment来实现这个接口,如设置TextView、加载Dialog、更新进度条等; Presenter:纽带层,用来连接Model和V

抬頭觸摸那一抹陽光的博客 503

Android百度天气demo

基于百度api写的demo,简单实用,查询各地天气只需要动态设置城市变量的值即可。

从零到一:RagFlow源码架构深度解析与二次开发实战指南

本文深入解析RagFlow源码架构,提供从环境搭建到二次开发的全流程实战指南。作为企业级AI搜索框架,RagFlow通过模块化设计和多模态处理能力,支持自定义智能体开发与文搜文档功能,帮助开发者高效构建智能搜索系统。

w1x2y3的博客 267

Android自定义view之天气折线图

Android自定义view之天气折线图最近公司一个项目需求,需要添加一个折线图,能够显示七天的天气信息。当然这个需求并不是很难,网上也有很多相关的例子,但是为了巩固下自定义view的基础,所以我决定还是自己写一个玩玩。不啰嗦,先上效果图(demo没有美化,比较简陋) 看了效果图,是不是感觉比较简单,麻雀虽小,但是五脏俱全,这里面囊括自定义view的核心。 先介绍下自定义view里面的几个核心方

Smile浅唱 3363

第二十届全国大学生智能汽车竞赛极速光电组:MicroPython与恩智浦RT1021的硬件编程实战指南

本文为参加第二十届全国大学生智能汽车竞赛极速光电组的同学提供了一份详尽的MicroPython与恩智浦RT1021硬件编程实战指南。文章深入剖析了选择MicroPython与RT1021这对组合的优势,详细讲解了从开发环境搭建、基础硬件控制(如GPIO、PWM、编码器、CCD)到系统集成(平衡控制、循迹算法)与多任务调试的全过程,旨在帮助参赛者降低嵌入式开发门槛,高效备赛。

wdx0123456的博客 843

Android 天气APP(二)获取定位信息(1)

显示详细定位信息

2401_84123213的博客 668

医药行业新零售项目数据分析报告——基于Excel的分析与可视化

不同平台客户支付金额用数字+百分比展示更直观。各大区支付金额分析较为粗浅,后续可加入不同大区人数、配送费等进行细分分析。图表略微单一,可采用组合图,运用两个及以上维度对数据进行分析。数据来源本项目数据来源于某机构的项目案例,以上分析内容均为本人原创,不涉嫌抄袭。原做项目,新平台首发。

2401_84213513的博客 1495

Windows/Mac/Linux三系统保姆级教程:用llama.cpp将safetensors模型转gguf格式(附常见错误解决)

本文提供Windows、Mac和Linux系统下使用llama.cpp将safetensors模型转换为gguf格式的详细教程,涵盖环境配置、转换原理及常见错误解决方案。通过跨平台兼容性处理,帮助开发者高效完成模型格式转换,优化边缘计算性能。

weixin_29227425的博客 270

android天气查询(一)websevice之ksoap2软件包的使用

对于用到天气信息,首先我想:   第一:数据不可能是我测得的,必须是网上的信息。 第二:网上的信息分为好多种,具体哪种比较好一点,这里我总结了两种。 第三:数据JSON怎么解析。 第四:如何提出数据与显示。 完成了上述步骤,那么我们就完成了基本是天气信息获取。 1.数据信息源                                                   数

feiyangxiaomi的专栏 2504

16G显存+llama.cpp跑大模型的黄金配置指南

大语言模型(LLM)本地部署的核心瓶颈在于显存与推理效率的平衡。llama.cpp作为轻量级C/C++推理引擎,通过GGUF模型格式、量化压缩(如Q4_K_M)和CUDA底层优化,显著降低GPU资源需求。在消费级硬件中,16G显存成为兼顾模型能力(如Qwen3-4B、Llama-3-8B)、长上下文支持(4K token)与系统稳定性的关键阈值。它既规避了12G显存的容量焦虑,又绕开了24G高端卡的成本与散热负担,特别适合Windows 11原生环境下的生产级AI应用,如RAG、智能客服与文档分析。

weixin_32629853的博客 405

Android 用MVVM框架模式+DataBinding+JSON来查询杭州天气信息(更新中)

下面举一个简单的例子来实践MVVM模式。完整的项目代码下载GitHub上查看: MVVMDemo 例子实现的主要功能是:点击按钮网络查询天气,查询成功后在界面上显示天气信息。主界面如下图所示: MVVM模式的代码组织结构建议按照业务功能进行划分,具体操作是:每个业务功能独立一个包存放,每个业务功能包下面再按Model、View、ViewModel分包存放。所有的Model存放在model包下面,所有的Activity和Fragment存放在activity包下面。所有的ViewModel存放在viewmo

彬sir哥的博客 1943

MicroLogix1400编程(使用RSLogix 500 + RSLinx Classic Lite)

MicroLogix1400编程

noscallion的博客 1万+

安装esxi7.0

保存重启后就能安装。vCenter Server是VMware vSphere虚拟化架构中的核心管理工具,充当ESXi主机及虚拟机中心管理点的服务,利用vCenter Server,可以集中管理多ESXi主机及其虚拟机,安装、配置和管理vCenter Server 不当可能会导致管理效率降低,或者致使EXSi主机和虚拟机停用。提示选择安装VMware ESXi 使用的存储,ESXi支持U盘以及SD卡安装,如系统中存在多块存储设备,选择需要安装系统的磁盘【注意磁盘142G,ESXI会将120G做VMFSL】

u011220233的博客 1万+

Android使用WebView来显示天气预报

利用webview实现的天气预报的简单获取,大家还可以对其稍加修改弄的更加华丽一点~~

kyrin(云中鹤) 1万+

ShowDoc item_id 未授权SQL注入漏洞复现

2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前置条件,易于利用,且默认情况下可暴破用户token获取系统后台权限,建议所有使用该系统的企业尽快升级修复,以确保系统安全。

0xSec 2357

Android的WebView简单使用实例(附Demo)

Demo地址:https://github.com/zGuangYuan/Androidstudio_example   WebView介绍: Android WebView在Android平台上是一个特殊的View, 基于webkit引擎、展现web页面的控件,这个类可以被用来在你的app中仅仅显示一张在线的网页,还可以用来开发浏览器。WebView内部实现是采用渲染引擎来展示view的...

广源的博客 3万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android使用WebView组件显示网页

Android使用WebView组件显示网页 代码实现效果如下图所示: 1.xml布局文件代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://sche

m0_66309026的博客 5330

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android webview简单使用,android WebView 简单使用Demo

activity配置文件:activity_main.xmlandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" >android:layout_width="match_parent"android:layout_height="wrap_c...

weixin_42151373的博客 337

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: Android中使用OkHttp的五种请求方式及注意事项
下一篇: Android中使用Retrofit的五种请求方式案例
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这次最后一次熬夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值