1. 打开官网,找到WebView的文档(模拟器不支持)

    鸿蒙webview的开发指南(原始链接,方便大家识别并点击):https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-webview-0000001092715158



2. 创建一个Page Ability,把基本布局弄好

下面是代码

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
<DirectionalLayout
ohos:height="30vp"
ohos:width="match_parent"
ohos:orientation="horizontal">
<TextField
ohos:id="$+id:text_webView_Url"
ohos:height="match_content"
ohos:width="match_parent"
ohos:background_element="$graphic:background_ability_simple_web_view"
ohos:focus_border_enable="true"
ohos:hint="请输入网址"
ohos:max_text_lines="1"
ohos:multiple_lines="false"
ohos:scrollable="true"
ohos:text="www.harmonyos.com"
ohos:text_size="50"
ohos:weight="1"
/>
<Button
ohos:id="$+id:button_webview_surf"
ohos:height="match_content"
ohos:width="60vp"
ohos:background_element="$graphic:button_element"
ohos:text="跳转"
ohos:text_size="50"/>
</DirectionalLayout>
<ProgressBar
ohos:id="$+id:other_webView_progressBar"
ohos:height="10vp"
ohos:width="match_parent"
ohos:visibility="hide">
</ProgressBar>
<ohos.agp.components.webengine.WebView
ohos:id="$+id:webview_webview_webview"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:weight="1">
</ohos.agp.components.webengine.WebView>
<DirectionalLayout
ohos:height="30vp"
ohos:width="match_parent"
ohos:orientation="horizontal">
<DirectionalLayout
ohos:height="match_content"
ohos:width="match_parent"
ohos:orientation="horizontal"
ohos:weight="1">
<Button
ohos:id="$+id:button_webview_back"
ohos:height="match_content"
ohos:width="match_parent"
ohos:background_element="$graphic:button_element"
ohos:layout_alignment="horizontal_center"
ohos:text="向后"
ohos:text_size="50"
>
</Button>
</DirectionalLayout>
<DirectionalLayout
ohos:height="match_content"
ohos:width="match_parent"
ohos:orientation="horizontal"
ohos:weight="1">
<Button
ohos:id="$+id:button_webview_refresh"
ohos:height="match_content"
ohos:width="match_parent"
ohos:background_element="$graphic:button_element"
ohos:layout_alignment="horizontal_center"
ohos:text="刷新"
ohos:text_size="50">
</Button>
</DirectionalLayout>
<DirectionalLayout
ohos:height="match_content"
ohos:width="match_parent"
ohos:orientation="horizontal"
ohos:weight="1">
<Button
ohos:id="$+id:button_webview_forward"
ohos:height="match_content"
ohos:width="match_parent"
ohos:background_element="$graphic:button_element"
ohos:layout_alignment="horizontal_center"
ohos:text="向前"
ohos:text_size="50">
</Button>
</DirectionalLayout>
</DirectionalLayout>
</DirectionalLayout>
  1. 把基本的按钮事件弄好

    序号 按钮 功能
    1 跳转 把文本框中的网址打开
    2 后退 在webview中点了新链接后,想回去看一看
    3 刷新 以前的人在网络不好,美女图片出不来的时候用,现在一般是发了一篇帖子后,作者会没事点一下,看看有没有人点赞
    4 前进 跟后退是关联用的,就是点了新链接,回去看了看后,还是觉得新链接更好看,就又要前进.

    代码

        Component.ClickedListener clickedListener = new Component.ClickedListener() {
    @Override
    public void onClick(Component component) {
    int componentId = component.getId();
    switch (componentId) {
    case ResourceTable.Id_button_webview_surf: {
    urlAddress = textWebViewUrl.getText();
    if (urlAddress.isEmpty()) {
    return;
    }
    if (!urlAddress.startsWith(FinalValue.URL_HTTPS)) {
    urlAddress = FinalValue.URL_HTTPS + urlAddress;
    }
    webView.load(urlAddress); }
    break;
    case ResourceTable.Id_button_webview_back: {
    if (webView.getNavigator().canGoBack()) {
    webView.getNavigator().goBack();
    }
    }
    break;
    case ResourceTable.Id_button_webview_refresh: {
    webView.reload();
    }
    break;
    case ResourceTable.Id_button_webview_forward: {
    if (webView.getNavigator().canGoForward()) {
    webView.getNavigator().goForward();
    }
    }
    break;
    default: {
    System.out.println("没有选择任何的页面");
    }
    break;
    }
    }
    };
    - config.json ``` json
    {
    "app": {
    "bundleName": "com.javaaier.family.huawei",
    "vendor": "javaaier",
    "version": {
    "code": 1,
    "name": "1.0"
    },
    "apiVersion": {
    "compatible": 5,
    "target": 5,
    "releaseType": "Beta1"
    }
    },
    "deviceConfig": { },
    "module": {
    "package": "com.javaaier.family.huawei",
    "name": ".MyApplication",
    "deviceType": [
    "phone"
    ],
    "distro": {
    "deliveryWithInstall": true,
    "moduleName": "entry",
    "moduleType": "entry"
    },
    "abilities": [
    {
    "skills": [
    {
    "entities": [
    "entity.system.home"
    ],
    "actions": [
    "action.system.home"
    ]
    }
    ],
    "orientation": "unspecified",
    "name": "com.javaaier.family.huawei.MainAbility",
    "icon": "$media:icon",
    "description": "$string:mainability_description",
    "label": "$string:app_name",
    "type": "page",
    "launchType": "standard"
    },
    {
    "orientation": "unspecified",
    "name": "com.javaaier.family.huawei.SimpleWebViewAbility",
    "icon": "$media:icon",
    "description": "$string:simplewebviewability_description",
    "label": "$string:app_name",
    "type": "page",
    "launchType": "standard"
    }
    ],
    "reqPermissions": [
    {
    "name": "ohos.permission.INTERNET"
    }
    ]
    }
    }
  • 把WebView照文档上面的要求弄好

    没啥好说的,就是规定.我加在了调用load方法打开网址那行代码后面,我还弄了一个跟进度条关联的功能

      //允许javascript交互
    
                        WebConfig webConfig = webView.getWebConfig();
    webConfig.setDataAbilityPermit(true);
    webConfig.setJavaScriptPermit(true);
    webConfig.setLoadsImagesPermit(true);
    webConfig.setMediaAutoReplay(true);
    webConfig.setLocationPermit(true);
    webConfig.setSecurityMode(WebConfig.SECURITY_SELF_ADAPTIVE); webView.setWebAgent(new WebAgent() {
    @Override
    public void onLoadingPage(WebView webView, String url, PixelMap favicon) {
    super.onLoadingPage(webView, url, favicon);
    // 这儿我加了一个更新网址文本框中新页面url的功能
    if (url != urlAddress) {
    textWebViewUrl.setText(url);
    } } @Override
    public void onPageLoaded(WebView webView, String url) {
    super.onPageLoaded(webView, url);
    // 页面加载结束后自定义处理
    } @Override
    public void onLoadingContent(WebView webView, String url) {
    super.onLoadingContent(webView, url);
    // 加载资源时自定义处理
    } @Override
    public void onError(WebView webView, ResourceRequest request, ResourceError error) {
    super.onError(webView, request, error);
    // 发生错误时自定义处理
    }
    });
    webView.setBrowserAgent(new BrowserAgent(SimpleWebViewAbilitySlice.this) {
    @Override
    public void onTitleUpdated(WebView webView, String title) {
    super.onTitleUpdated(webView, title);
    // 标题变更时自定义处理
    } @Override
    public void onProgressUpdated(WebView webView, int newProgress) {
    super.onProgressUpdated(webView, newProgress);
    if (newProgress < FinalValue.PROGRESS_BAR_FINISHED) {
    otherWebViewProgressBar.setVisibility(Component.VISIBLE);
    otherWebViewProgressBar.setProgressValue(newProgress);
    } else if (newProgress == FinalValue.PROGRESS_BAR_FINISHED) {
    otherWebViewProgressBar.setVisibility(Component.HIDE);
    }
    // 加载进度变更时自定义处理
    }
    });
  • 完事?or完了还有事?

    从上面拷代码的话,估计完事了.但是,我是用的回忆,但是代码却没有回退,所以我还是有必要在这儿把步骤中的问题说一说,方便不拷代码的同学也能跑出一个界面.主要体现如下:

    1. 权限配置,不多说

       "reqPermissions": [
      {
      "name": "ohos.permission.INTERNET"
      }
      ]
  • xml中的WebView要带包名

      <ohos.agp.components.webengine.WebView
    ohos:id="$+id:webview_webview_webview"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:weight="1">
    </ohos.agp.components.webengine.WebView>
    1. 不按上面包名写的话:

      • 真机运行后没有WebView的界面.哪怕weight=1,也不行
      • 点击跳转按钮后,PageAbility会闪退,回到首屏(调用它的页面)

    完事效果:https://www.bilibili.com/video/BV1tK4y1o7Hz/

  • 完整代码

    • 布局

      序号为2的步骤中贴全了

    • 按钮背景

      <?xml version="1.0" encoding="UTF-8" ?>
      <shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
      ohos:shape="rectangle">
      <corners
      ohos:radius="20"/>
      <solid
      ohos:color="#70dbdb"/>
      </shape>
  • java代码

    package com.javaaier.family.huawei.slice;
    
    import com.javaaier.family.huawei.ResourceTable;
    import com.javaaier.family.huawei.common.FinalValue;
    import ohos.aafwk.ability.AbilitySlice;
    import ohos.aafwk.content.Intent;
    import ohos.agp.components.*;
    import ohos.agp.components.webengine.*;
    import ohos.media.image.PixelMap; /**
    * @Author JavaAIer
    * @Description : webview控件例子1:用于简单的测试webview的用法 <br/>
    * 001 简单webview示例
    * @Date: 2021/4/16
    */
    public class SimpleWebViewAbilitySlice extends AbilitySlice {
    String urlAddress; ProgressBar otherWebViewProgressBar;
    TextField textWebViewUrl;
    Button buttonWebViewSurf, buttonWebViewBack, buttonWebViewRefresh, buttonWebViewForward;
    WebView webView; Component.ClickedListener clickedListener = new Component.ClickedListener() {
    @Override
    public void onClick(Component component) {
    int componentId = component.getId();
    switch (componentId) {
    case ResourceTable.Id_button_webview_surf: {
    urlAddress = textWebViewUrl.getText();
    if (urlAddress.isEmpty()) {
    return;
    }
    if (!urlAddress.startsWith(FinalValue.URL_HTTPS)) {
    urlAddress = FinalValue.URL_HTTPS + urlAddress;
    }
    webView.load(urlAddress); //允许javascript交互 WebConfig webConfig = webView.getWebConfig();
    webConfig.setDataAbilityPermit(true);
    webConfig.setJavaScriptPermit(true);
    webConfig.setLoadsImagesPermit(true);
    webConfig.setMediaAutoReplay(true);
    webConfig.setLocationPermit(true);
    webConfig.setSecurityMode(WebConfig.SECURITY_SELF_ADAPTIVE); webView.setWebAgent(new WebAgent() {
    @Override
    public void onLoadingPage(WebView webView, String url, PixelMap favicon) {
    super.onLoadingPage(webView, url, favicon);
    // 页面开始加载时自定义处理
    if (url != urlAddress) {
    textWebViewUrl.setText(url);
    } } @Override
    public void onPageLoaded(WebView webView, String url) {
    super.onPageLoaded(webView, url);
    // 页面加载结束后自定义处理
    } @Override
    public void onLoadingContent(WebView webView, String url) {
    super.onLoadingContent(webView, url);
    // 加载资源时自定义处理
    } @Override
    public void onError(WebView webView, ResourceRequest request, ResourceError error) {
    super.onError(webView, request, error);
    // 发生错误时自定义处理
    }
    });
    webView.setBrowserAgent(new BrowserAgent(SimpleWebViewAbilitySlice.this) {
    @Override
    public void onTitleUpdated(WebView webView, String title) {
    super.onTitleUpdated(webView, title);
    // 标题变更时自定义处理
    } @Override
    public void onProgressUpdated(WebView webView, int newProgress) {
    super.onProgressUpdated(webView, newProgress);
    if (newProgress < FinalValue.PROGRESS_BAR_FINISHED) {
    otherWebViewProgressBar.setVisibility(Component.VISIBLE);
    otherWebViewProgressBar.setProgressValue(newProgress);
    } else if (newProgress == FinalValue.PROGRESS_BAR_FINISHED) {
    otherWebViewProgressBar.setVisibility(Component.HIDE);
    }
    // 加载进度变更时自定义处理
    }
    });
    }
    break;
    case ResourceTable.Id_button_webview_back: {
    if (webView.getNavigator().canGoBack()) {
    webView.getNavigator().goBack();
    }
    }
    break;
    case ResourceTable.Id_button_webview_refresh: {
    webView.reload();
    }
    break;
    case ResourceTable.Id_button_webview_forward: {
    if (webView.getNavigator().canGoForward()) {
    webView.getNavigator().goForward();
    }
    }
    break;
    default: {
    System.out.println("没有选择任何的页面");
    }
    break;
    }
    }
    }; /**
    * @Author JavaAIer
    * @Description :
    * @Date: 2021/4/16 14:46
    * * @param intent
    */
    @Override public void onStart(Intent intent) {
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_ability_simple_web_view);
    otherWebViewProgressBar = (ProgressBar) findComponentById(ResourceTable.Id_other_webView_progressBar);
    textWebViewUrl = (TextField) findComponentById(ResourceTable.Id_text_webView_Url);
    buttonWebViewSurf = (Button) findComponentById(ResourceTable.Id_button_webview_surf);
    buttonWebViewSurf.setClickedListener(clickedListener);
    buttonWebViewBack = (Button) findComponentById(ResourceTable.Id_button_webview_back);
    buttonWebViewBack.setClickedListener(clickedListener);
    buttonWebViewRefresh = (Button) findComponentById(ResourceTable.Id_button_webview_refresh);
    buttonWebViewRefresh.setClickedListener(clickedListener);
    buttonWebViewForward = (Button) findComponentById(ResourceTable.Id_button_webview_forward);
    buttonWebViewForward.setClickedListener(clickedListener);
    webView = (WebView) findComponentById(ResourceTable.Id_webview_webview_webview); } @Override
    public void onActive() {
    super.onActive();
    } @Override
    public void onForeground(Intent intent) {
    super.onForeground(intent);
    }
    }
    /*
    * 这一截卡哇伊大喵在config.json用了,我发现用不用没啥区别啊
    * https://blog.csdn.net/qq_33259323/article/details/115596296
    * "default": {
    "network": {
    "cleartextTraffic": true,
    "securityConfig": {
    "domainSettings": {
    "cleartextPermitted": true,
    "domains": [
    {
    "subdomains": true,
    "name": "www.harmonyos.com"
    }
    ]
    }
    }
    }
    }
    *
    * */

    作者:人工智能姬

    想了解更多内容,请访问51CTO和华为合作共建的鸿蒙社区:https://harmonyos.51cto.com

001 - 使用鸿蒙WebView创建简单浏览器 step 1的更多相关文章

  1. Web Service 的创建简单编码、发布和部署

    最近,老大准备将已有的C/S架构项目中的通信部分做成通用,需要将其支持WebService为以后项目向着B/S架构升级做好铺垫,为此身为屌丝的我去各种百度WebService是个什么卵玩意,然后逐渐搭 ...

  2. 创建简单的响应式HTML5模版

    创建简单的响应式HTML5模版 HTML5目前发展势头良好,已经逐渐得到大部分浏览器不同程度的支持.许多web开发者也已经学习到了不少关于HTML 5的基础知识并开始试图使用HTML 5制作网页.与此 ...

  3. django初探-创建简单的博客系统

    django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...

  4. simulink创建简单模型

    创建简单模型 您可以使用 Simulink® 对系统建模,然后仿真该系统的动态行为.Simulink 允许您创建模块图,图中的各个连接模块代表系统的各个部分,信号代表这些模块之间的输入/输出关系.Si ...

  5. 基于Gecko内核的简单浏览器实现

    分享一个基于Gecko内核的简单浏览器实现过程. 项目需要需要开发一个简单浏览器,由于被访问的网页中有大量Apng做的动画,使用IE内核的webbrowser不能播放,使用基于WebKit和Cefsh ...

  6. Intellij创建简单Springboot项目

    Intellij创建简单Springboot项目 第一步:选择创建新项目——file-new-project 第二步:选择项目类型——Spring Initializr-next 第三步:输入项目信息 ...

  7. django初探-创建简单的博客系统(一)

    django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...

  8. mininet+floodlight搭建sdn环境并创建简单topo

    第一步:安装git sudo apt-get update sudo apt-get install git 测试git是否安装成功: git 第二步:安装mininet 1.获取mininet最新源 ...

  9. python创建简单网站

    前言 本方法基于web2py框架,使用web2py的完整网站数据包创建简单网站. web2py 是一个为Python语言提供的全功能Web应用框架,旨在敏捷快速的开发Web应用,具有快速.安全以及可移 ...

随机推荐

  1. 【.NET 与树莓派】控制舵机

    不管是小马达,还是大马达,嗯,也就是电机,相信大伙伴们也不会陌生.四驱车是一种很优秀的玩具,从老周小时候就开始流行(动画片<四驱兄弟>估计很多大朋友都看过),直到现在还能看到很多卖四驱车的 ...

  2. Elasticsearch简介、倒排索引、文档基本操作、分词器

    lucene.Solr.Elasticsearch 1.倒排序索引 2.Lucene是类库 3.solr基于lucene 4.ES基于lucene 一.Elasticsearch 核心术语 特点: 1 ...

  3. 一次 MySQL 线上死锁分析实战

    关键词:MySQL Index Merge 前言 MySQL 的锁机制相信大家在学习 MySQL 的时候都有简单的了解过,那既然有锁就必定绕不开死锁这个问题.其实 MySQL 在大部分场景下是不会存在 ...

  4. .NET gRPC 核心功能初体验,附Demo源码

    gRPC是高性能的RPC框架, 有效地用于服务通信(不管是数据中心内部还是跨数据中心). 由Google开源,目前是一个Cloud Native Computing Foundation(CNCF)孵 ...

  5. COM技术中的VARIANT and VARIANTARG

    VARIANT and VARIANTARG Use VARIANTARG to describe arguments passed within DISPPARAMS, and VARIANT to ...

  6. abp中多种登陆用户的设计

    项目地址:https://gitee.com/bxjg1987/abp 场景 在<学校管理系统>中,学生.家长.教师.教务都可能登陆,做一些属于他们自己的操作.这些用户需要的属性各不相同, ...

  7. 【HTB系列】 靶机Swagshop的渗透测试详解

    出品|MS08067实验室(www.ms08067.com) 本文作者:是大方子(Ms08067实验室核心成员) 总结与反思 使用vi提权 magento漏洞的利用 magescan 工具的使用 靶机 ...

  8. .net 开源模板引擎jntemplate 教程:基础篇之语法

    一.基本概念 上一篇我们简单的介绍了jntemplate并写了一个hello world(如果没有看过的,点击查看),本文将继续介绍jntemplate的模板语法. 我们在讲解语法前,首先要了解一下标 ...

  9. Apache配置 6. 访问日记切割

    日志一直记录总有一天会把整个磁盘占满,所以有必要让它自动切割,并删除老的日志文件 (1)配置 (1)配置 # vim /usr/local/apache2 .4/conf/extra/httpd-vh ...

  10. (2)MySQL进阶篇SQL优化(show status、explain分析)

    1.概述 在应用系统开发过程中,由于初期数据量小,开发人员写SQL语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SQL语句开始逐渐显露出性能问题,对生产环境的影响也 ...