Webview妙用(实现源生复杂UI页面)

2023-10-27

前几天,前同事找到我,具体是让我帮忙,实现一个类似答题的UI页面(这哥们又接外包了--!)。

1、具体功能如图:



2、做为一个android程序员,首先自然想到是在android上如何实现。捋了一下官方给出的所有控件,并没有能解决该UI界面的方法,于是,只能自定义view了。


3、首先思路是创建自定义view,然后用textPaint绘制文字及下划线。用onTouch判断位置,设置点击事件。思路很清晰,做下去后发现,存在两个问题。

  • textPaint无法绘制出下划线。(原因未明)
  • 点击事件该如何设置。

4、无法绘制下划线的问题,可能是厂商或者版本的问题,具体也没有去深究了(真不是一个合格的程序员。。。)

5、既然解决不了上述两个问题,只能用其他办法了。条条大路同罗马嘛,不能在一个胡同里面扎死。所以灵机一动,为什么不用h5实现。

6、思路是有了,技术上基本没有难点。点击事件只需要简单的h5与源生交互。行了,马上行动。

7、具体方法如下:

1、编写h5代码:

/********************
 * 作者:malus
 * 日期:16/10/15
 * 时间:上午10:06
 * 注释:
 ********************/
public class StringUtil {

    static String[] str = {"    ①    ","    ②    ","    ③    ","    ④    ","    ⑤    ","    ⑥    ","    ⑦    ","    ⑧    ","    ⑨    ","    ⑩    ","    ⑪    ","    ⑫    ","    ⑬    ","    ⑭    ","    ⑮    ","    ⑯    ","    ⑰    ","    ⑱    ","    ⑲    ","    ⑳    "};

    static String msg = "The Zapata rail (@ cerverai) is a medium-sized, dark-coloured rail. It has brown @, greyish-blue underparts, a red-based yellow bill, white undertail coverts, and red eyes and @. Its short wings render it almost flightless. It is endemic to the wetlands of the Zapata Peninsula in southern @, where its only known nest was found in sawgras.";

    static int mIndex = 0;

    public static String getQuestion(){
        msg = "<!DOCTYPE html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><html><body>"+msg+"</html></body>";

        while (msg.contains("@")){
            msg = msg.replaceFirst("@","<a href='http://www.baidu.com?index="+mIndex+"'>"+str[mIndex]+"</a>");
            mIndex++;
        }
        return msg;
    }
}

2、webview展示:

<span style="white-space:pre">	</span>mWebView = (WebView)findViewById(R.id.webview);
        mWebView.loadData(StringUtil.getQuestion(),"text/html; charset=UTF-8",null);

3、点击事件交互:

<span style="white-space:pre">	</span>mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
            }
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if(url.contains("index=")){
                    String index = url.split("index=")[1];
                    int mIndex = Integer.parseInt(index);
                    Toast.makeText(MainActivity.this,"答案"+mIndex,Toast.LENGTH_LONG).show();
                }
                return true;
            }
        });

8、实现结果我就不描述了。这里并没有涉及到太难的技术点。我只是想提供一个思路,就是一个复杂的,源生难以实现的页面,换做h5实现可能也是一个不错的方法。如果只是简单的loaddata,对性能的影响应该不大。

9、感谢阅读,纯分享,不喜勿喷。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Webview妙用(实现源生复杂UI页面) 的相关文章

  • 如何在android中点击画布上绘制的圆圈?

    我正在开发一个人脸检测应用程序 在这个应用程序中 我必须在脸上的眼睛和嘴巴用户可以点击拖动圆圈 在检测到的人脸上根据自己设置位置 因此 所有圆圈都已成功绘制在脸上 但我无法单击特定圆圈并使用缩小选项在整个脸上移动 请建议我有关相同问题的正确
  • 如何检测android中的颠倒方向?

    在我的 Android 应用程序中 我有全景图像 并且我使用 TYPE ORIENTATION 传感器根据手机运动旋转该图像 它对于横向和纵向都工作良好 这是旋转逻辑的代码 Override public void onSensorChan
  • 为网络和/或持久存储序列化 Android Bundle?

    我需要序列化一个全面的应用程序 游戏 状态 以便通过网络传输或保存到磁盘并在以后检索 当然 捆绑包用于在多个用例中保存 恢复状态 因此使用它们将是理想的选择 但是 由于某种原因 Bundle 不可序列化 寻找解决方案只发现了将 Bundle
  • 明文 HTTP 流量...不允许

    我的程序从用户那里获取一个 URL 因此它可以向互联网上的任何网站发出请求 我试图让这成为可能 我查找了有关 Android HTTP Cleartext 错误的所有答案 并做了这个 但它仍然不允许我连接我的测试本地 PHP 服务器 我在这
  • 将 ArrayList 保存在捆绑包 savingInstanceState 中

    ArrayList 是在类级别定义的 这些是我保存的实例方法 Override protected void onSaveInstanceState Bundle outState super onSaveInstanceState out
  • 如何在Firebase Android应用程序中分离两个不同的用户?

    我有一个应用程序 有两种不同类型的用户 一种是教师 第二种是普通用户 如果普通会员登录 他会去normal memberActivity如果他是教师会员 他会去Teacher memberActivity 我如何在登录活动中执行此操作 我的
  • 如何在代码中设置TextView的文字颜色?

    在 XML 中 我们可以通过以下方式设置文本颜色textColor属性 比如android textColor FF0000 但如何通过编码来改变它呢 我尝试过类似的东西 holder text setTextColor R color R
  • 如何从debug.keystore文件获取MD5?

    我使用一些命令来获取 MD5 私钥debug keystore文件 但实际上我得到的是 SHA1 私钥而不是 MD5 我不知道如何获得MD5 这是我使用的命令 keytool list alias androiddebugkey keyst
  • 来自外部 XML 的 Android 本地化

    是否可以使用从服务接收到的 XML 在运行时翻译 Android 应用程序 如果可能的话 请有人指出我正确的方向 谢谢 Warning 我读到的所有内容都表明 让您的应用程序更改语言不是一个好主意 因为 Android 框架不支持它 并且可
  • 将搜索结果更新为 Android 中的 Lazy Adapter

    我有项目列表 想为其实现搜索功能 因此 我有一个带有 addTextChangedListener 的文本框 搜索结果运行良好 但当我尝试将结果设置为 ListView 时 新结果将附加到旧结果中 我正在使用惰性适配器 如何清除适配器中的旧
  • 使用startActivityForResult,如何获取子活动中的requestCode?

    我有四项活动 即 A B C 和 D 我的情况是A将通过startActivityForResult启动活动B startActivityForResult new Intent this B class ONE 在另一种情况下 我将使用不
  • 改造Android基本且简单的问题

    我的服务器返回简单的 Json 结果 如下所示 message Upload Success 我正在尝试将结果放入改造模型类中 public class MyResponse SerializedName message String me
  • 如果联系人与电话通讯录中的应用程序关联,则显示应用程序图标

    我正在尝试显示与该应用程序关联的电话号码的应用程序图标 我试着跟随this http www c99 org 2010 01 23 writing an android sync provider part 1 链接但是太难了 有没有任何库
  • EditText 的高度不会扩展到其父级的高度

    我在滚动视图中放置了编辑文本 高度 match parent并期望它的高度等于滚动视图 但事实并非如此 它的高度就像wrap content这意味着如果 EditText 中没有文本 我必须将光标指向要弹出的软键盘的第一 行 我想要的是我可
  • 在 Android SDK 中通过单击按钮更改背景颜色不起作用

    我有一个简单的程序 可以在单击按钮后更改背景颜色 但它不起作用 public class ChangeBackgroundActivity extends Activity Called when the activity is first
  • Android 视图和视图组

    在安卓中ViewGroup继承自View A ViewGroup是一个容器 里面装有Views ViewGroup LinearLayout View TextView 为什么 Android 的人们将这种关系定义为Inheritance而
  • 在Android中提取视频帧

    我想知道是否可以从 Android 中正在运行的视频中提取帧 我需要定期提取帧并将其发送以进行进一步处理 有人能为我找到答案吗 Thanks Abhi 您可以使用媒体元数据检索器 http developer android com ref
  • 如何用 XML 制作双渐变(类似 iphone)

    如何使用 XML 制作这种可绘制渐变 我可以做一个从颜色 A 到颜色 B 的简单渐变 但我不知道如何在同一个可绘制对象中组合两个渐变 我终于找到了一个带有图层列表的解决方案 这对我来说已经足够好了
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显
  • SambaFileInputStream 和 FileInputStream 有什么不同?

    我需要从 samba 服务器流式传输视频 并且我使用 nanohttpd 在我的项目中创建简单的服务器 当我使用本地文件中的 fileinputstream 时 视频视图可以按设置播放视频 http localhost 8080 publi

随机推荐

  • 如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数 我发现将二维数组作参数进行传递还不是想象得那么简单里 但是最后我也解决了遇到的问题 所以这篇文章主要介绍如何处理二维数组当作参数传递的情况 希望大家不至于再在这上面浪费时间 正文 首先 我引
  • android 弹出式对话框实现自定义菜单栏

    第一步 创建菜单项实体类 Menu 菜单栏选项类 public class Menu 标题 private String title Id 图片Id private int iconID public Menu String title i
  • OpenWrt安装使用教程(x86/64架构)

    什么是OpenWrt 官网简介 OpenWrt项目是一个针对嵌入式设备的Linux操作系统 OpenWrt不是一个单一且不可更改的固件 而是提供了具有软件包管理功能的完全可写的文件系统 这使您可以从供应商提供的应用范围和配置中解脱出来 并且
  • springboot 实现权限管理(一)

    一 背景 1 为什么进行权限管理 生活在形形色色的世界之中 我们各自扮演着各自的角色 拥有不同的权利和义务 映射在计算机系统之中 也一样需要 角色 权限 来进行对用户的分类 限制访问资源 保证资源地合理被使用 使人各司其职 2 应用场景 假
  • 如何生成静态页面的五种方案

    方案1
  • 数据挖掘流程-HCIE-BigData

    机器学习流程 机器学习流程 1 了解需求 确认目标 2 获取数据 3 审阅数据 4 数据分析 4 1 统计分析 4 2 相关性分析 4 3 图形分析 1 散点图 2 热力图 3 直方图 4 统计图 5 柱状图 6 饼图 7 综合绘图 5 数
  • java自动化测试语言高级之泛型

    java自动化测试语言高级之泛型 文章目录 java自动化测试语言高级之泛型 Java 泛型 Java 泛型 Java 泛型 generics 是 JDK 5 中引入的一个新特性 泛型提供了编译时类型安全检测机制 该机制允许程序员在编译时检
  • element plus 使用 icon 图标(两种方式)

    前提 Element UI 和 Element Plus 对 Icon 图标 的使用方式改变较大 在此记录 Element UI Icon 图标 使用CSS 类名方式 Element Plus Icon 图标 使用Vue 组件方式 安装 n
  • -128的补码及原码、反码、补码

    一 原码 一个字节占8位 一个字长为n的机器数能表示不同的数字的个数是固定的2 n个 n 8时2 n 256 用来表示有符号数 数的范围就是 2 n 1 2 n 1 1 n 8时 这个范围就是 128 127 用来表示无符号数 就不需要用一
  • 【异步编程】1. 异步编程的实现方式

    总体介绍 回调函数的方式 使用回调函数的方式有一个缺点是 多个回调函数嵌套的时候会造成回调函数地狱 上下两层的回调函数间的代码耦合度太高 不利于代码的可维护 Promise的方式 使用 Promise 的方式可以将嵌套的回调函数作为链式调用
  • 指针、引用与const指针

    指针与引用 1 综述 2 指针 2 1 什么是指针 2 2 代码示例1 2 3 代码示例2 3 引用 3 1 什么是引用 3 2 引用的代码示例 4 const 迷惑 鄙人的C 是在网易云课堂上跟着吕鑫老师学的 课程名字叫 C语言 C 数据
  • echarts人员关系网络图,张三朋友的朋友扩散图

    我的另外一个博客echarts实现关系网络图 单个节点可无限扩散 方便实用易懂 就是通过下方这个改的 所以这个是最原版的代码 大家可以参考一下 其实意思很明了 主人公张三是中心点 第二层就是展示他的朋友 第三层是朋友的朋友 第四层循环下去
  • 【Qt】报错error: undefined reference to `vtable for的解决方法

    1 问题描述 编译Qt程序时 在某个类构造函数定义处报错 error undefined reference to vtable for 2 原因分析 导致错误信息的原因是 子类没有实现父类的纯虚函数 在Qt中 首先要想到的是在一个类中添加
  • crontab定时删除tomcat日志

    一 前言 前面一篇文章讲了在linux环境中按日期切割tomcat生成的Catalina out日志 虽然日志切割了 但是生成的日志文件还是会占用磁盘空间 积累一段时间还是会造成磁盘空间不够用的情况 之前的做法是手动的删除tomcat日志
  • win下nginx+php7+mysql配置

    win下nginx php7 mysql配置 nginx mysql部署请查看 洗盡鉛華 最終是你 php7部署 下载安装包 http yuefly com upload software php 7 2 33 nts Win32 VC15
  • set nx px

    我们知道分布式锁的特性是排他 避免死锁 高可用 分布式锁的实现可以通过数据库的乐观锁 通过版本号 或者悲观锁 通过for update Redis的setnx 命令 Zookeeper 在某个持久节点添加临时有序节点 判断当前节点是否是序列
  • python3中argparse模块

    python3中argparse模块 1 argparse是python标准库里面用来处理命令行参数的库 2 命令行参数分为位置参数和选项参数 位置参数就是程序根据该参数出现的位置来确定的 root openstack 1 ls root
  • JAVA面对对象继承性---方法覆写

    二 覆写 继承性的主要特征是子类可以根据父类已有的功能进行功能的扩展 但是在子类定义属性或方法时 有可能出现定义的属性或方法与父类同名的情况 这样的操作就称为覆写 方法的覆写 当子类定义了和父类的方法名称 返回值类型 参数类型及个数完全相同
  • Verilog function 函数

    文章目录 语法 函数的定义 函数的调用 递归调用 多文件调用 语法 function automatic return type name port list statements endfunction Verilog中的Function
  • Webview妙用(实现源生复杂UI页面)

    前几天 前同事找到我 具体是让我帮忙 实现一个类似答题的UI页面 这哥们又接外包了 1 具体功能如图 2 做为一个android程序员 首先自然想到是在android上如何实现 捋了一下官方给出的所有控件 并没有能解决该UI界面的方法 于是