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

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



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

下面是代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <DirectionalLayout
  3. xmlns:ohos="http://schemas.huawei.com/res/ohos"
  4. ohos:height="match_parent"
  5. ohos:width="match_parent"
  6. ohos:orientation="vertical">
  7. <DirectionalLayout
  8. ohos:height="30vp"
  9. ohos:width="match_parent"
  10. ohos:orientation="horizontal">
  11. <TextField
  12. ohos:id="$+id:text_webView_Url"
  13. ohos:height="match_content"
  14. ohos:width="match_parent"
  15. ohos:background_element="$graphic:background_ability_simple_web_view"
  16. ohos:focus_border_enable="true"
  17. ohos:hint="请输入网址"
  18. ohos:max_text_lines="1"
  19. ohos:multiple_lines="false"
  20. ohos:scrollable="true"
  21. ohos:text="www.harmonyos.com"
  22. ohos:text_size="50"
  23. ohos:weight="1"
  24. />
  25. <Button
  26. ohos:id="$+id:button_webview_surf"
  27. ohos:height="match_content"
  28. ohos:width="60vp"
  29. ohos:background_element="$graphic:button_element"
  30. ohos:text="跳转"
  31. ohos:text_size="50"/>
  32. </DirectionalLayout>
  33. <ProgressBar
  34. ohos:id="$+id:other_webView_progressBar"
  35. ohos:height="10vp"
  36. ohos:width="match_parent"
  37. ohos:visibility="hide">
  38. </ProgressBar>
  39. <ohos.agp.components.webengine.WebView
  40. ohos:id="$+id:webview_webview_webview"
  41. ohos:height="match_parent"
  42. ohos:width="match_parent"
  43. ohos:weight="1">
  44. </ohos.agp.components.webengine.WebView>
  45. <DirectionalLayout
  46. ohos:height="30vp"
  47. ohos:width="match_parent"
  48. ohos:orientation="horizontal">
  49. <DirectionalLayout
  50. ohos:height="match_content"
  51. ohos:width="match_parent"
  52. ohos:orientation="horizontal"
  53. ohos:weight="1">
  54. <Button
  55. ohos:id="$+id:button_webview_back"
  56. ohos:height="match_content"
  57. ohos:width="match_parent"
  58. ohos:background_element="$graphic:button_element"
  59. ohos:layout_alignment="horizontal_center"
  60. ohos:text="向后"
  61. ohos:text_size="50"
  62. >
  63. </Button>
  64. </DirectionalLayout>
  65. <DirectionalLayout
  66. ohos:height="match_content"
  67. ohos:width="match_parent"
  68. ohos:orientation="horizontal"
  69. ohos:weight="1">
  70. <Button
  71. ohos:id="$+id:button_webview_refresh"
  72. ohos:height="match_content"
  73. ohos:width="match_parent"
  74. ohos:background_element="$graphic:button_element"
  75. ohos:layout_alignment="horizontal_center"
  76. ohos:text="刷新"
  77. ohos:text_size="50">
  78. </Button>
  79. </DirectionalLayout>
  80. <DirectionalLayout
  81. ohos:height="match_content"
  82. ohos:width="match_parent"
  83. ohos:orientation="horizontal"
  84. ohos:weight="1">
  85. <Button
  86. ohos:id="$+id:button_webview_forward"
  87. ohos:height="match_content"
  88. ohos:width="match_parent"
  89. ohos:background_element="$graphic:button_element"
  90. ohos:layout_alignment="horizontal_center"
  91. ohos:text="向前"
  92. ohos:text_size="50">
  93. </Button>
  94. </DirectionalLayout>
  95. </DirectionalLayout>
  96. </DirectionalLayout>
  1. 把基本的按钮事件弄好

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

    代码

    1. Component.ClickedListener clickedListener = new Component.ClickedListener() {
    2. @Override
    3. public void onClick(Component component) {
    4. int componentId = component.getId();
    5. switch (componentId) {
    6. case ResourceTable.Id_button_webview_surf: {
    7. urlAddress = textWebViewUrl.getText();
    8. if (urlAddress.isEmpty()) {
    9. return;
    10. }
    11. if (!urlAddress.startsWith(FinalValue.URL_HTTPS)) {
    12. urlAddress = FinalValue.URL_HTTPS + urlAddress;
    13. }
    14. webView.load(urlAddress);
    15. }
    16. break;
    17. case ResourceTable.Id_button_webview_back: {
    18. if (webView.getNavigator().canGoBack()) {
    19. webView.getNavigator().goBack();
    20. }
    21. }
    22. break;
    23. case ResourceTable.Id_button_webview_refresh: {
    24. webView.reload();
    25. }
    26. break;
    27. case ResourceTable.Id_button_webview_forward: {
    28. if (webView.getNavigator().canGoForward()) {
    29. webView.getNavigator().goForward();
    30. }
    31. }
    32. break;
    33. default: {
    34. System.out.println("没有选择任何的页面");
    35. }
    36. break;
    37. }
    38. }
    39. };
    40. - config.json
    41. ``` json
    42. {
    43. "app": {
    44. "bundleName": "com.javaaier.family.huawei",
    45. "vendor": "javaaier",
    46. "version": {
    47. "code": 1,
    48. "name": "1.0"
    49. },
    50. "apiVersion": {
    51. "compatible": 5,
    52. "target": 5,
    53. "releaseType": "Beta1"
    54. }
    55. },
    56. "deviceConfig": {
    57. },
    58. "module": {
    59. "package": "com.javaaier.family.huawei",
    60. "name": ".MyApplication",
    61. "deviceType": [
    62. "phone"
    63. ],
    64. "distro": {
    65. "deliveryWithInstall": true,
    66. "moduleName": "entry",
    67. "moduleType": "entry"
    68. },
    69. "abilities": [
    70. {
    71. "skills": [
    72. {
    73. "entities": [
    74. "entity.system.home"
    75. ],
    76. "actions": [
    77. "action.system.home"
    78. ]
    79. }
    80. ],
    81. "orientation": "unspecified",
    82. "name": "com.javaaier.family.huawei.MainAbility",
    83. "icon": "$media:icon",
    84. "description": "$string:mainability_description",
    85. "label": "$string:app_name",
    86. "type": "page",
    87. "launchType": "standard"
    88. },
    89. {
    90. "orientation": "unspecified",
    91. "name": "com.javaaier.family.huawei.SimpleWebViewAbility",
    92. "icon": "$media:icon",
    93. "description": "$string:simplewebviewability_description",
    94. "label": "$string:app_name",
    95. "type": "page",
    96. "launchType": "standard"
    97. }
    98. ],
    99. "reqPermissions": [
    100. {
    101. "name": "ohos.permission.INTERNET"
    102. }
    103. ]
    104. }
    105. }
  • 把WebView照文档上面的要求弄好

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

    1. //允许javascript交互
    2. WebConfig webConfig = webView.getWebConfig();
    3. webConfig.setDataAbilityPermit(true);
    4. webConfig.setJavaScriptPermit(true);
    5. webConfig.setLoadsImagesPermit(true);
    6. webConfig.setMediaAutoReplay(true);
    7. webConfig.setLocationPermit(true);
    8. webConfig.setSecurityMode(WebConfig.SECURITY_SELF_ADAPTIVE);
    9. webView.setWebAgent(new WebAgent() {
    10. @Override
    11. public void onLoadingPage(WebView webView, String url, PixelMap favicon) {
    12. super.onLoadingPage(webView, url, favicon);
    13. // 这儿我加了一个更新网址文本框中新页面url的功能
    14. if (url != urlAddress) {
    15. textWebViewUrl.setText(url);
    16. }
    17. }
    18. @Override
    19. public void onPageLoaded(WebView webView, String url) {
    20. super.onPageLoaded(webView, url);
    21. // 页面加载结束后自定义处理
    22. }
    23. @Override
    24. public void onLoadingContent(WebView webView, String url) {
    25. super.onLoadingContent(webView, url);
    26. // 加载资源时自定义处理
    27. }
    28. @Override
    29. public void onError(WebView webView, ResourceRequest request, ResourceError error) {
    30. super.onError(webView, request, error);
    31. // 发生错误时自定义处理
    32. }
    33. });
    34. webView.setBrowserAgent(new BrowserAgent(SimpleWebViewAbilitySlice.this) {
    35. @Override
    36. public void onTitleUpdated(WebView webView, String title) {
    37. super.onTitleUpdated(webView, title);
    38. // 标题变更时自定义处理
    39. }
    40. @Override
    41. public void onProgressUpdated(WebView webView, int newProgress) {
    42. super.onProgressUpdated(webView, newProgress);
    43. if (newProgress < FinalValue.PROGRESS_BAR_FINISHED) {
    44. otherWebViewProgressBar.setVisibility(Component.VISIBLE);
    45. otherWebViewProgressBar.setProgressValue(newProgress);
    46. } else if (newProgress == FinalValue.PROGRESS_BAR_FINISHED) {
    47. otherWebViewProgressBar.setVisibility(Component.HIDE);
    48. }
    49. // 加载进度变更时自定义处理
    50. }
    51. });
  • 完事?or完了还有事?

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

    1. 权限配置,不多说

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

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

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

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

  • 完整代码

    • 布局

      序号为2的步骤中贴全了

    • 按钮背景

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

    1. package com.javaaier.family.huawei.slice;
    2. import com.javaaier.family.huawei.ResourceTable;
    3. import com.javaaier.family.huawei.common.FinalValue;
    4. import ohos.aafwk.ability.AbilitySlice;
    5. import ohos.aafwk.content.Intent;
    6. import ohos.agp.components.*;
    7. import ohos.agp.components.webengine.*;
    8. import ohos.media.image.PixelMap;
    9. /**
    10. * @Author JavaAIer
    11. * @Description : webview控件例子1:用于简单的测试webview的用法 <br/>
    12. * 001 简单webview示例
    13. * @Date: 2021/4/16
    14. */
    15. public class SimpleWebViewAbilitySlice extends AbilitySlice {
    16. String urlAddress;
    17. ProgressBar otherWebViewProgressBar;
    18. TextField textWebViewUrl;
    19. Button buttonWebViewSurf, buttonWebViewBack, buttonWebViewRefresh, buttonWebViewForward;
    20. WebView webView;
    21. Component.ClickedListener clickedListener = new Component.ClickedListener() {
    22. @Override
    23. public void onClick(Component component) {
    24. int componentId = component.getId();
    25. switch (componentId) {
    26. case ResourceTable.Id_button_webview_surf: {
    27. urlAddress = textWebViewUrl.getText();
    28. if (urlAddress.isEmpty()) {
    29. return;
    30. }
    31. if (!urlAddress.startsWith(FinalValue.URL_HTTPS)) {
    32. urlAddress = FinalValue.URL_HTTPS + urlAddress;
    33. }
    34. webView.load(urlAddress);
    35. //允许javascript交互
    36. WebConfig webConfig = webView.getWebConfig();
    37. webConfig.setDataAbilityPermit(true);
    38. webConfig.setJavaScriptPermit(true);
    39. webConfig.setLoadsImagesPermit(true);
    40. webConfig.setMediaAutoReplay(true);
    41. webConfig.setLocationPermit(true);
    42. webConfig.setSecurityMode(WebConfig.SECURITY_SELF_ADAPTIVE);
    43. webView.setWebAgent(new WebAgent() {
    44. @Override
    45. public void onLoadingPage(WebView webView, String url, PixelMap favicon) {
    46. super.onLoadingPage(webView, url, favicon);
    47. // 页面开始加载时自定义处理
    48. if (url != urlAddress) {
    49. textWebViewUrl.setText(url);
    50. }
    51. }
    52. @Override
    53. public void onPageLoaded(WebView webView, String url) {
    54. super.onPageLoaded(webView, url);
    55. // 页面加载结束后自定义处理
    56. }
    57. @Override
    58. public void onLoadingContent(WebView webView, String url) {
    59. super.onLoadingContent(webView, url);
    60. // 加载资源时自定义处理
    61. }
    62. @Override
    63. public void onError(WebView webView, ResourceRequest request, ResourceError error) {
    64. super.onError(webView, request, error);
    65. // 发生错误时自定义处理
    66. }
    67. });
    68. webView.setBrowserAgent(new BrowserAgent(SimpleWebViewAbilitySlice.this) {
    69. @Override
    70. public void onTitleUpdated(WebView webView, String title) {
    71. super.onTitleUpdated(webView, title);
    72. // 标题变更时自定义处理
    73. }
    74. @Override
    75. public void onProgressUpdated(WebView webView, int newProgress) {
    76. super.onProgressUpdated(webView, newProgress);
    77. if (newProgress < FinalValue.PROGRESS_BAR_FINISHED) {
    78. otherWebViewProgressBar.setVisibility(Component.VISIBLE);
    79. otherWebViewProgressBar.setProgressValue(newProgress);
    80. } else if (newProgress == FinalValue.PROGRESS_BAR_FINISHED) {
    81. otherWebViewProgressBar.setVisibility(Component.HIDE);
    82. }
    83. // 加载进度变更时自定义处理
    84. }
    85. });
    86. }
    87. break;
    88. case ResourceTable.Id_button_webview_back: {
    89. if (webView.getNavigator().canGoBack()) {
    90. webView.getNavigator().goBack();
    91. }
    92. }
    93. break;
    94. case ResourceTable.Id_button_webview_refresh: {
    95. webView.reload();
    96. }
    97. break;
    98. case ResourceTable.Id_button_webview_forward: {
    99. if (webView.getNavigator().canGoForward()) {
    100. webView.getNavigator().goForward();
    101. }
    102. }
    103. break;
    104. default: {
    105. System.out.println("没有选择任何的页面");
    106. }
    107. break;
    108. }
    109. }
    110. };
    111. /**
    112. * @Author JavaAIer
    113. * @Description :
    114. * @Date: 2021/4/16 14:46
    115. * * @param intent
    116. */
    117. @Override
    118. public void onStart(Intent intent) {
    119. super.onStart(intent);
    120. super.setUIContent(ResourceTable.Layout_ability_simple_web_view);
    121. otherWebViewProgressBar = (ProgressBar) findComponentById(ResourceTable.Id_other_webView_progressBar);
    122. textWebViewUrl = (TextField) findComponentById(ResourceTable.Id_text_webView_Url);
    123. buttonWebViewSurf = (Button) findComponentById(ResourceTable.Id_button_webview_surf);
    124. buttonWebViewSurf.setClickedListener(clickedListener);
    125. buttonWebViewBack = (Button) findComponentById(ResourceTable.Id_button_webview_back);
    126. buttonWebViewBack.setClickedListener(clickedListener);
    127. buttonWebViewRefresh = (Button) findComponentById(ResourceTable.Id_button_webview_refresh);
    128. buttonWebViewRefresh.setClickedListener(clickedListener);
    129. buttonWebViewForward = (Button) findComponentById(ResourceTable.Id_button_webview_forward);
    130. buttonWebViewForward.setClickedListener(clickedListener);
    131. webView = (WebView) findComponentById(ResourceTable.Id_webview_webview_webview);
    132. }
    133. @Override
    134. public void onActive() {
    135. super.onActive();
    136. }
    137. @Override
    138. public void onForeground(Intent intent) {
    139. super.onForeground(intent);
    140. }
    141. }
    142. /*
    143. * 这一截卡哇伊大喵在config.json用了,我发现用不用没啥区别啊
    144. * https://blog.csdn.net/qq_33259323/article/details/115596296
    145. * "default": {
    146. "network": {
    147. "cleartextTraffic": true,
    148. "securityConfig": {
    149. "domainSettings": {
    150. "cleartextPermitted": true,
    151. "domains": [
    152. {
    153. "subdomains": true,
    154. "name": "www.harmonyos.com"
    155. }
    156. ]
    157. }
    158. }
    159. }
    160. }
    161. *
    162. * */

    作者:人工智能姬

    想了解更多内容,请访问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. 微信小程序:条件渲染wx:if和hidden

    一.条件渲染:wx:if,wx:elif,wx:else 花括号中的true或false可以改成变量从而来动态显示. 二.hidden 只显示hidden2 当标签不是频繁切换显示(控制是否渲染到页面 ...

  2. Dyno-queues 分布式延迟队列 之 辅助功能

    Dyno-queues 分布式延迟队列 之 辅助功能 目录 Dyno-queues 分布式延迟队列 之 辅助功能 0x00 摘要 0x01 前文回顾 0x2 Ack机制 2.1 加入Un-ack集合 ...

  3. vs调试qt代码,无法单步调试

    在使用vs调试qt代码时,可以编译但无法单步调试QT源码.报错缺少qmain_win.cpp或者其他q******.cpp文件. 1.因为安装qt时没有安装qt源码库,重新下载一个src源码就可以了. ...

  4. Linux磁盘分区格式化和扩容

    Note:根据各系统上磁盘的类型不同,磁盘命名规则也会不同:例如/dev/xvd,/dev/sd,/dev/vd,/dev/hd 目录 磁盘格式化 MBR格式 GPT分区 磁盘扩容 MBR格式扩容 G ...

  5. POJ-2387(原始dijkstra求最短路)

    Til the Cows Come Home POJ-2387 这题是最简单的最短路求解题,主要就是使用dijkstra算法,时间复杂度是\(O(n^2)\). 需要注意的是,一定要看清楚题目的输入要 ...

  6. 基于Hi3559AV100 RFCN实现细节解析-(3)系统输入VI分析一 :

    下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,整个过程涉及到VI.VDEC.VPSS.VGS.VO.NNIE,其中涉及的内容,大家可以参考之前我写的博客: Hi3559AV100的 ...

  7. mock 请求分发

    首发于 语雀文档 背景是这样的 我们公司的后管项目走的不是 resful 风格的 api,而是走后管网关,后管网关会将请求进行分发,具体怎么分发,有这么以下几点: 请求全部走 POST 请求 URL ...

  8. dubbo实战之四:管理控制台dubbo-admin

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. slickgrid ( nsunleo-slickgrid ) 2 修正区域选择不能跨冻结列的问题

    slickgrid( nsunleo-slickgrid )  2 修正区域选择不能跨冻结列的问题 周六的时候,留了个小小的尾巴,区域选择的问题进做到了定位: 问题原因,在slickgrid启动冻结之 ...

  10. C语言入门-mingw64安装+配置

    OK,大家好,结合上期所说,本期让我们来配置编译器吧! 首先先下载mingw64离线包,官网下载慢,可以去群里下载,*.7z格式(有些同学可能没有解压软件,为了照顾这部分同学,笔者提供*.exe格式的 ...