Android webview中的无限滚动

2023-12-30

我有一些本地 html 文件,我想用无限滚动方法显示它们。

NOTE:我无法更改 html 内容,所以请不要建议向其中添加 javascript。我必须在运行时执行此操作。

所以,我发现我可以执行javascript在运行时通过loadUrl("javascript: ....").

我覆盖了onOverScrolled()的方法webView找出用户何时到达 webView 的末尾。 (它行事小心,所以问题不在这里)

问题是有时新内容成功附加,有时则未附加。

在日志中我可以看到页面结束方法被触发,检索新的html正文被调用,执行javascript代码被调用,但它没有影响。

这是我的代码,可能出了问题,我看不到它:

@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY)
{
    super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
    if(clampedY & reloadFlag) //for first time realodFlag is false, when the WebViewClient.onPageFinished() get called it turn to ture
    {
        if (!(isVerticalScrollPossible(SCROLL_DOWN)))
        {
            reloadFlag = false; 
            currUri = nextResource(currUri); //findout next page
            appendNextPage();
        }

    }
}

private final int SCROLL_DOWN = 1;
private final int SCROLL_UP = -1;

private boolean isVerticalScrollPossible(int direction)
{
    final int offset = computeVerticalScrollOffset();
    final int range = computeVerticalScrollRange() - computeVerticalScrollExtent();
    if (range == 0) return false;
    if (direction < 0) {
        return offset > 0;
    } else {
        return offset < range - 1;
    }
}

public String getNextPageJS(Uri currPage)
{
    String body = getNextPageBody(currPage);
    //Log.d("myTAG", body);
    String jsResult = "javascript:(function() { document.body.innerHTML += '<div id=\"separator\" style=\"height:10px; margin-top:10px; margin-bottom:10px; background-color:#000000;\"></div>" + body + "';})()";
    return jsResult;
}

private void appendNextPage()
{
    reloadFlag = false;
    Thread appendThread = new Thread(null, doAppend, "backgroundAppend");
    appendThread.start();
    Log.i("appendNextPage", "get called");
}

public String rs = "";
private Runnable doAppend = new Runnable()
{
    @Override
    public void run() 
    {
        Log.i("doAppend", "get called + currUri: " + currUri);
        rs = getNextPageJS(currUri);
        //loadUrl(rs);
        appendHandler.sendEmptyMessage(0);
    }       
};

private Handler appendHandler = new Handler()
{
    public void handleMessage(Message msg)
    {
        loadUrl(rs);
        reloadFlag = true;
        Log.i("appendHandler", "get called");       
    }
};

NOTE:有时我会在模拟器日志中得到这个(不是在真实设备中):

I/chromium(1339): [INFO:CONSOLE(1)] "Uncaught SyntaxError: An invalid or illegal string was specified.", source: http://localhost:1025/OEBPS/Text/Section0042.xhtml (1)

页数有时会有所不同,可能是因为 JavaScript 代码不好,我不知道。

hints:

1)我不是javascript编码员,所以可能javascript代码不好

2)或者可能多次调用javascript代码会导致此问题

3)我知道javascript代码必须在页面完全加载后执行,所以也许代码调用得太早,问题是onPageFinished()仅在第一页被调用,并且当通过javascript代码附加新内容时它不会被调用,我尝试使用线程解决这个问题,并且我认为它有效。

UPDATE:我发现当 html body 较小时,这段代码可以正常工作,但是当我尝试附加较大的 body 时,它不起作用。是loadUrl()方法有字符限制吗?或任何其他想法?


好的,我发现了问题,如果有人想知道的话。

问题是loadUri()(至少在我的情况下)无法一次加载太多的html标签(在我编写的javascript代码中)

所以,解决办法很简单,一一加载标签即可。

这是我使用的代码:

public ArrayList<String> getNextPageBody(Uri currAddress)
{
    String html = getHtml(currAddress); // this is the all html tags in the next file

    //get body elements as arrayList, using jsoup
    Document doc = Jsoup.parse(html);
    Elements elements = doc.select("body").first().children();
    ArrayList<String> chuncks = new ArrayList<String>();
    for (org.jsoup.nodes.Element el : elements)
    {
        chuncks.add(el.toString());
    }

    return chuncks;
}

public void loadBodyChunk(ArrayList<String> bodyChunks)
{    
    //show a separator for each page
    bodyChunks.add(0, "javascript:(function() { document.body.innerHTML += '<div id=\"separator\" style=\"height:10px; margin-top:10px; margin-bottom:10px; background-color:#000000;\"></div>';}())");
    loadUrl(bodyChunks.get(0));

    for(int i = 1; i < bodyChunks.size(); i++)
    {   
        String jsResult = "javascript:(function() { document.body.innerHTML += '" +  bodyChunks.get(i) + "';}())";
        loadUrl(jsResult);
    }

    reloadFlag = true;
}

EDIT:

还: 首先是'String 中的 s 应替换为\' :

body = body.replace("'", "\\'");

那么所有换行符都应该被消除:

body = body.replaceAll(System.getProperty("line.separator"), " ");

所有问题都解决了。

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

Android webview中的无限滚动 的相关文章

  • 使用协程对任务进行排队

    我最近开始阅读有关协程的内容 我想询问某个场景 考虑一个带有一个按钮的简单屏幕 单击后 它会执行一堆打印语句和一些延迟 其间 到目前为止 我正在使用协程来实现这一目标 现在 我的问题是 如果用户反复向该按钮发送垃圾邮件 是否有一种方法可以将
  • 依赖于多个模块的 Gradle Android 单元测试

    我正在开发一个具有多个模块的项目 我们正在为应用程序编写 junit 测试用例 并且我们正在使用以下异常 开始试运行 java lang RuntimeException java lang ClassNotFoundException 下
  • 代理阻止网络套接字?如何绕行

    我有一个用 Python 编写的正在运行的 websocket 服务器 来自https github com opiate SimpleWebSocketServer https github com opiate SimpleWebSoc
  • 如何在 jQgrid 中隐藏列但在添加/编辑面板中显示此列

    我想要一种我使用的控制形式 但字段数量太高了 如何显示网格 但只有表单添加 编辑弹出面板中的某些字段显示所有字段 以下是您可以执行此操作的方法 colModel name email label E mail editable true h
  • 将 JSON 字符串传递给 Django 模板

    我一直在用头撞墙 试图找出为什么我无法将从 Django 模型生成的 JSON 字符串传递到模板的 javascript 静态文件中 事实证明 问题不在模型级别 使用serializers serialize 在脚本本身中放入相同的字符串将
  • Android 中 Bitmap 和 Drawable 有什么区别?

    我用谷歌搜索 但找不到任何文章来描述 Android 中 Bitmap 和 Drawable 之间的区别 位图是位图图像的表示 类似于 java awt Image Drawable 是 可以绘制的东西 的抽象 它可能是一个位图 包装为Bi
  • 在 Jscript 中实例化 System.Threading.Thread 对象

    我正在尝试使用 Jscript 创建一个新的 System Threading Thread 对象 但我无法让构造函数工作 如果我只是执行以下操作 var thread new Thread threadFunc function thre
  • AndroidPlot:从 1 到 11 的域标签

    我已经在我的应用程序中实现了 AndroidPlot 除了 X 轴标签 从 0 到 10 之外 它工作得很好 我想显示 1 到 11 此外 Y 轴上的标签不会出现 我正在使用的代码 import java text DecimalForma
  • 如何更改Android软键盘中任意键的按键背景

    我想让键盘上的一些键与其他键不同 例如下图中的shift 删除 空格键 根据google的参考文档 我们可以通过使用 来改变按键的背景android keybackground drawable xxx in input xml 但它改变了
  • 如何在列表视图中选择时启用视频序列自动播放?

    大家好 有人可以与我分享一下我如何编写我的 viewvideo java 类 以便它允许自动播放视频功能 自动排序在列表视图中播放所选视频的任务 从当前位置到最新录制的视频 按顺序直到最新的视频播放完毕 这类似于 YouTube 自动播放功
  • 使用Doctype让scrollTop返回0,为什么?

    当我将此 Doctype 放入我的文档中时document body scrollTop返回零 这是为什么 当您使用该 Doctype 时 您会将每个当前浏览器放入所谓的几乎标准模式 http hsivonen iki fi doctype
  • 需要将焦点放在react中的div上

    我有一个之前用 H1 标签包裹的文本 页面加载后 我需要专注于该文本 为了方便起见 我将它包装在 div 中 render const translate billing primaryContactSelection true this
  • 如何列出特定服务器的所有成员?

    我的代码是 const list client guilds find id 335507048017952771 for user of list users console log user 1 username 这实际上没有任何作用
  • 如何在flutter app android中添加Startapp广告?

    我想用其他广告更改 AdMob 广告 一些个人问题 如何在flutter app android中添加Startapp广告 有什么方法可以将启动广告添加到我的 flutter 应用程序 android 中 StartApp 现已更名为 St
  • queue.js 是如何工作的?

    我一直试图理解如何Mike Bostock 的queue js https github com mbostock queue blob master queue js有效 但我看不出它是如何工作的 我不明白的部分是代码如何设法继续执行回调
  • 掩码输入数字 - 百分比

    如何通过 jQuery 创建具有百分比的数字掩码输入 我是否让输入仅接受三个数字 并在用户完成输入时在数字后添加百分号 keyup 我不使用插件 例子 1 Or 30 Or 99 Or 100 Or 200
  • 如何在Android手机上而不是模拟器上运行或调试?

    Android 模拟器速度太慢 无法测试运行的应用程序 有没有办法使用 IDE 而不是模拟器在真实手机上调试 运行应用程序 通常 您可以在手机上打开 USB 调试 然后通过 USB 将其连接到 PC 然后 手机将以与模拟器相同的方式出现在
  • 如何从 Google Fit API 获取步数?

    请原谅我的笨蛋 我对 Android 和 Google API 完全陌生 我有以下连接到 GoogleFit 的代码 我还有一个 API 密钥和 Oauth 我在哪里 如何使用 API 密钥和 Oauth 关于如何获取它们的指南有很多 但关
  • 如何从 vue 组件调用 App.vue 中的方法

    我有一个 vue 组件和一个 vue 元素声明 如下所示 Vue component todo item template li This is a todo li methods test function I am getting an
  • JavaScript:如何在 Internet Explorer 中模拟更改事件(委托)

    UPDATE 回顾 小提琴和赏金 这个问题并没有引起太多关注 所以我将花一些时间来解决这个问题 我知道我的答案和问题都过于冗长 这就是为什么我继续设置这把小提琴 http jsfiddle net vVA8N 在我看来 这是我目前必须用来接

随机推荐

  • 如何将自定义 jar 发布到本地 Apache Ivy 存储库

    我已阅读所有教程和示例 但仍然无法在本地 Ivy 存储库中发布一组自定义 jar 编辑 基本上我想要与 maven install plugin 相同的行为 这是我的设置 我有一个 Ant 任务 它在给定文件夹中生成 jars 文件夹名称不
  • 如何在优先级队列中使用pair,然后使用键作为优先级返回值

    所以我想使用最小的键作为优先级 然后返回相应键的 VALUE import javafx util Pair import java util PriorityQueue public class Test public static vo
  • 实体框架更新 - 上下文当前未跟踪实体

    我正在尝试更新实体 但收到以下错误 上下文当前未跟踪该实体 我的数据库表由以下字段组成 赛程日期 联赛 ID FK A 队 FK B 队 FK 我的代码如下 public void UpdateFixture Fixture validFi
  • 如何在 Next Js (React) 中实施 adobe 分析?

    我已经提出了在我构建的 React js 应用程序中添加 adobe Analytics 的要求 请抱歉 我对如何实现它没有任何基本的想法 理解 所以专家的帮助对我来说非常有帮助 要求是我需要在中实施 adobe 分析next js wit
  • .Net ThreadPool 线程上的异常

    复制 如何从 ThreadPool QueueUserWorkItem 捕获异常 https stackoverflow com questions 753841 我正在 Net ThreadPool 上对多个委托进行排队 以进行大量独立的
  • 如何在 Aptana Studio 中自动缩进 JavaScript 代码?

    之前我使用Eclipse进行PHP和Java开发 我喜欢这个命令Ctrl i自动缩进代码 现在我使用基于Eclipse的Aptana Studio进行JavaScript开发 我想自动缩进我的 JavaScript 代码 但是Ctrl i删
  • 如何将外部CSS应用到flutter webview中的html渲染

    我想将外部 css 应用到在 flutter webview 中渲染的 html 在 android 中 它是使用以下语法完成的 您可以通过调用以下命令将任何 JavaScript 提交到您的 Web 视图 flutterWebViewPl
  • “System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常

    我正在 MVC 4 aspnet 网站中使用 EF5 在本地 一切正常 但是当我将其发布到 IIS 并尝试进入时 出现错误 System Data Entity Internal AppConfig 的类型初始值设定项 抛出异常 详细异常情
  • 填充div的空间

    我想要一个元素来填充父 div 的剩余空间 我已经成功做到了这一点 您可以在此处看到 链接已删除 但填充 div 右侧 位于左侧 div 下方 我基本上希望右侧的 div 从左侧的 div 结束的地方开始 希望这是有道理的
  • 从 TangoService_connectOnFrameAvailable 保存帧

    如何通过 TangoService connectOnFrameAvailable 保存帧并在我的计算机上正确显示它 作为此参考页 https developers google com project tango apis c struc
  • Angular bootstrap typeahead 不适用于 Angular 1.3.0

    我创建了一个小插件来表明这是行不通的 任何人都可以帮助我如何使用 typeahead 与 1 3 0 angularJS 提供替代解决方案 我们将其与 angular bootstrap 0 11 0 和最新版本的 bootstrap 一起
  • 角度测试在反应式表单上提交事件

    Context 我有一个具有基本形式 反应形式 的组件 我尝试测试此表单上的提交事件 看看它是否正确调用了必要的方法 我的问题 无法触发表单的提交事件 Files 组件 html
  • 如何使用新的 jstree v3.0.0 按需加载子项

    我正在寻找一些帮助在 jstree 中按需 扩展 填充子节点 我可以填充父节点 但无法填充子节点 设想 我正在使用 jstree 来填充树中的节点 我的数据源是json 但是 我从不同的服务获取父节点 从不同的服务获取子节点 我正在使用新的
  • 使用 GPU 加速 MATLAB 代码?

    AccelerEyes 于 2012 年 12 月宣布与 Mathworks 合作开发 GPU 代码 并已停止生产 Jacket for MATLAB http blog accelereyes com blog 2012 12 12 ex
  • 构建maven项目时编译错误

    我们正在尝试从 Jenkins 构建并部署一个 Maven 工件到我们的 Nexus 存储库管理器中 但我们在构建过程中遇到了编译错误 这是我们收到的错误 错误 未能执行目标 org apache maven plugins maven c
  • 如何在 Chrome 上调试 JavaScript

    我有一个奇怪的问题 jquery load 有时在 chrome 上失败 我不会用细节来打扰你们 我只是在寻找如何调试这样的问题的指导者 我想也许 firebug 可以提供帮助 但问题只发生在 chrome 上 甚至适用于 IE 我做类似的
  • 使用 XMLHttpRequest 上传文件

    我正在尝试使用拖放插件 http pascalprecht github com DnD js 在javascript中使用ajax上传文件
  • 从 HTML 表单到 PDF

    有没有一种简单的方法可以在网页上创建 HTML 表单 当用户提交时 将数据放入 PDF 文件并将其发送给接收者 该网页在 net 上运行 Thanks Umbraco http our umbraco org projects websit
  • 如何使用 C# 或 XAML 创建自动动画轮播循环图像?

    我已经在 Web 开发中完成了轮播 但通过 XAML 或 C 在 WPF 中为它们设置动画对我来说是新鲜事 网上有一些例子 但它们要么已经过时 要么不是我想要的 即使当我玩弄其他项目的源代码时 这也不是我所希望的 我想让图像自动从左到右 水
  • Android webview中的无限滚动

    我有一些本地 html 文件 我想用无限滚动方法显示它们 NOTE 我无法更改 html 内容 所以请不要建议向其中添加 javascript 我必须在运行时执行此操作 所以 我发现我可以执行javascript在运行时通过loadUrl