Gmail Android 应用程序如何为邮件对话视图发挥 webview-header-overlay 的魔力?

2023-12-27

Using 层次结构查看器 http://developer.android.com/guide/developing/debugging/debugging-ui.htmlGmail 对话视图上显示了一个有趣且不寻常的布局层次结构:

  • All单个对话中的消息呈现在singleWebView(具体来说是com.google.android.gm.CustomWebView,如左图所示)。仅呈现消息正文 -标题所在的空格留空.
  • 在 WebView 的顶部覆盖了一个com.google.android.gm.MessageHeaderScrollView(见右图)它使用HybridConversationScrollContainer定位一个MessageHeaderView在对话视图中每条消息的正确位置。

CustomWebView <-> MessageHeaderScrollView

那么,这是如何(以及为什么)实现的呢? Android 开发人员可以并且应该渴望在自己的应用程序中重新创建这种东西吗?

显然有可能why性能 - WebView 使用消息文本的快速本机 WebKit 渲染,并且单个 WebView 可能比每条消息的单独 WebView 更有效。如果有人看过有关其性能优势的任何优秀博客文章,我会很感兴趣。

然而,这种方法存在明显的复杂性成本(相对于天真地使用可扩展列表视图 http://developer.android.com/reference/android/widget/ExpandableListView.html里面有一些 TextViews 或者其他什么) -HybridConversationScrollContainer必须以某种方式找出消息头应该在网络渲染上的位置,以便将其定位MessageHeaderViews正确。我想知道的是:How它能计算出这些偏移量吗?


顺便说一句,我能想到的唯一方法是基于 javascript - 在 WebView 中使用 javascript 收集标题坐标,然后使用WebView.addJavascriptInterface()将这些坐标传递给 Java 并HybridConversationScrollContainer。我自己还没有尝试过这样做,所以我不确定它是否真的有效。

There isandroid 开发者博客上的一篇简短文章讨论了addJavascriptInterface() method:

http://android-developers.blogspot.com/2008/09/using-webviews.html http://android-developers.blogspot.com/2008/09/using-webviews.html

如果MessageHeaderScrollView可以作为开源库发布 - 我会使用它! - 但鉴于 Gmail 应用程序已关闭,这似乎不太可能。

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

Gmail Android 应用程序如何为邮件对话视图发挥 webview-header-overlay 的魔力? 的相关文章

  • 在解决依赖关系之前运行 gradle 任务

    我想运行一个 gradle 任务 在 gradle 尝试解决依赖关系之前获取其他源并设置它们 在 build gradle 中有一个任务 用于获取子项目的源代码 该任务需要在 Gradle 尝试解决依赖关系之前运行 因为子项目是依赖关系的一
  • 无法禁用 Firestore 中的离线数据

    从我的数据中删除数据后Firestore Database 这需要我的Android app一段时间后才意识到数据已被删除 我认为这是由于自动数据缓存而发生的 我的应用程序与离线使用无关 我想禁用此功能 我已将其添加到我的自定义中Appli
  • Android 测试 java.lang.NoClassDefFoundError 由于 Fest-Android 出现错误

    我目前正在我的项目中实现 Android 版 Fest 但我似乎遇到了依赖问题 如果我在不包含 Fest 库的情况下运行测试 测试将正常运行 一旦我添加了 Fest 库 测试就不再运行 相反 会抛出异常 我的项目使用以下依赖项 compil
  • Android异步服务调用策略

    这是场景 客户端对服务进行远程调用 返回 void 并提供 回调对象 服务在后台线程上执行一些长时间运行的逻辑 然后使用回调对象来触发以太成功或失败 因为这些操作视觉元素 执行 Activity runOnUiThread 块 该场景运行良
  • Android - 启用和禁用蓝牙 - SDK 3 (OS 1.5) - 以编程方式?

    我编写了代码来以编程方式启用和禁用各种功能 例如 Wifi 振铃模式 飞行模式 您将在电源切换小部件中看到的所有内容 我还没有找到如何做的一个是蓝牙 看来在 SDK level 3 OS 1 5 中没有漂亮的蓝牙管理器类 有没有人指出关于启
  • android新手需要了解“?android:attr/actionBarSize”

    我正在经历拉尔斯 沃格尔的教程 http www vogella com articles AndroidFragments article html在使用 Fragments 时 我遇到了以下代码 android layout margi
  • Android 服务 START_STICKY START_NOT_STICKY

    我需要让我的服务始终在后台运行 并使用 startService 函数启动我的服务 无论应用程序的状态如何 我都不想重新启动服务 这是我的观察 START STICKY gt 如果应用程序启动 则服务正在重新启动 当应用程序关闭时 服务也会
  • Android 应用程序主活动出现 ClassNotFoundException

    大多数设备都可以运行我的应用程序 但我收到此错误报告 java lang RuntimeException Unable to instantiate activity ComponentInfo com company app com c
  • Android/java:从 ProGuard 过渡/迁移到 R8?

    我想知道如何从ProGuard to R8 我是否应该从 Gradle 文件中删除与 Proguard 相关的行并添加android enableR8 true线代替 Thanks Proguard 由 GuardSquare 开发和维护
  • Android:NotificationCompat.MediaStyle 操作按钮不执行任何操作

    我有一个简单的 Android 应用程序 其中包含一个Activity and a Service源自于MediaBrowserServiceCompat 我已成功将其设置为通过使用播放我的主要活动中的音频MediaBrowserCompa
  • Android物理引擎[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在研究了 3D 游戏编程之后 很快就明白了为什么物理引擎非常有用 Android 支持哪些物理引擎并且可以在 Android 上使用 关于
  • 不同风格的模块文件

    我正在尝试在同一个应用程序中实现播放服务和华为服务 但希望能够按风格配置使用哪一个 每种风格都使用自己的 applicationIdSuffix 因此 对于每种不同的风格 华为插件都会失败 我无法编译 我的应用程序模块包含agconnect
  • 如何将您的终端与 Android 模拟器连接

    我尝试导航到 android 工具文件夹并输入 adb shell 命令 但它似乎不起作用 我的终端似乎只能识别命令的 adb 部分 并给我一条错误消息 我究竟做错了什么 通过键入列出所有连接的设备adb devices 检查是否列出了任何
  • 测试应用内结算:“发布者无法购买此商品”

    我的应用程序似乎已准备好在我的设备上进行应用内购买程序的 现实生活 测试 但是 我在 Play 商店中收到 发布商无法购买此商品 的错误消息 现在 我应该如何测试这个 我不想通过仅用于测试的虚拟帐户重新安装手机来丢失手机的配置 在开发者控制
  • 如何在没有 OpenCv Manager 的情况下运行 OpenCV 代码

    我正在使用 OpenCV4Android 版本 2 4 10 并在 Samsung Galayx GT I9300 上测试我的代码 我遇到的问题是 我必须从 Play 商店下载 Opencv Manager 以便我的 opencv 代码运行
  • 使用Android Camera API,拍摄照片的方向始终未定义

    我使用相机API 拍摄的照片总是旋转90度 我想旋转它 所以首先我想知道图片的方向 这一点我被卡住了 我总是以两种方式得到未定义的方向 这是代码 Override public void onPictureTaken byte data C
  • Android 布局仅使一个视图将自己绘制为横向,但其他所有视图都使用纵向

    我的活动布局中的主要视图元素是 VideoView 我的视频被渲染为设备的横向分辨率 但视频中的所有内容都是横向的 因此仍然需要在设备处于纵向位置时观看 即使我必须将活动设置为android screenOrientation landsc
  • 如何在不下载子项的情况下从 Firebase 获取子项密钥?

    我有一个 Firebase 数据库 其中的节点 items 有很多子项 我想导入子项键的列表 由于每个子项都包含相当多我对此不感兴趣的数据 因此我想仅下载子项密钥 以最大程度地减少传输的数据量 为了便于说明 假设我有以下数据结构 然后我想获
  • 如何在 Android 应用程序退出之前进行一些清理?

    当我的 Android 应用程序终止时 是否有某种 onTerminate 方法可以进行一些清理 我想清除一些 SharedPreferences 我有一个活动 它保持几个数字的运行平均值 并将其存储在 SharedPreference 中
  • 在自定义对话框中设置文本视图

    我创建了一个自定义对话框 但无法将文本设置到 java 对话框布局中的文本视图中 并且我的程序崩溃了 我的错误是什么 public class Total CBC extends Activity Override protected vo

随机推荐

  • 如何在 v8 Javascript 中的多个函数中使用相同的上下文?

    我是 V8 新手 尝试在 C 和 JS 代码之间创建一些绑定 问题是我无法跨不同的 Javascript 函数访问全局 Javascript 变量 原因是因为每个 Javascript 函数都调用了不同的 C 函数 我猜我的代码的问题是我在
  • 一次保存编辑器中所有打开的 .m 文件

    运行代码 获取旧结果 确实 再次忘记保存已编辑的 m 文件之一 一次保存所有打开的 m 文件的键盘快捷键是什么 您可以添加快捷方式Save All动作 至少在我正在使用的R2015a中 I chose CTRL ALT S 如何到达那里已在
  • 有没有办法在Android上调用ActionScript?

    我的资产文件夹中有一个 SWF 文件 我需要在 Android 应用程序中使用它 所以我编写了嵌入 SWF 和 Javascript 的 html 文件来调用其 ActionScript 我可以在 WebView 中播放 Flash 文件
  • 如何将参数传递给自定义 zsh 函数?

    如何将参数传递给自定义 zsh 函数 例如 function kill port proc port lsof i tcp
  • 修改 R 中 data.table 中的值

    我是 data table 的新手 我对这个类有疑问 我有一张桌子 data1 有 2 列 Couple and Ratio Couple is the Keydata table 的 我正在尝试修改表中的值 在下面的代码中 cple是现有
  • 使用渲染插件将模板转换为 pdf 时,css 背景不起作用

    我正在使用渲染插件在 grails 中生成 pdf 我正在使用由 css 准备的背景颜色 代码在这里 container content mainContent block backgroundStyle background ffffff
  • android:将字节转换为dex时出错

    因此 在升级 build gradle 项目 后运行项目时出现以下错误 dependencies classpath com android tools build gradle 2 0 0 alpha2 NOTE Do not place
  • Rspec:如何在控制器规范中分配实例变量

    class TestController lt AplicationController private def some method unless my variable nil return true end end end 我想测试
  • 如何在Visual Studio中生成aspx.designer.cs? [复制]

    这个问题在这里已经有答案了 我当前的 aspx designer cs 无法正常工作 有人知道如何在解决方案资源管理器中重新生成 aspx designer cs 吗 Found here http labs kaliko com 2010
  • 有没有办法在Java中声明一个方法“友好”?

    我知道可以设置属性public friendly or private指定其可见性 有没有办法我可以声明friendly方法 我希望它只能从同一包的类的对象访问 谢谢你 这里是初学者 通过不输入可见性修饰符 Java 使用包私有范围 查看以
  • 如何创建具有共享表结构的多租户数据库?

    我们的软件目前运行在 MySQL 上 所有租户的数据都存储在同一个schema中 由于我们使用 Ruby on Rails 我们可以轻松确定哪些数据属于哪个租户 然而 当然也有一些公司担心他们的数据可能会受到损害 因此我们正在评估其他解决方
  • 如何限制对 codeigniter 文件夹中文件的访问

    您好 我已经使用 codeigniter 来开发我的网站 但是当在 google 中搜索我的网站时 google 会显示特定文件夹中文件 pdf 的链接 用户可以直接查看这些文件 pdf 而无需登录 我想限制谷歌直接显示这些文件的链接 例如
  • Windows 身份验证与表单身份验证

    我试图了解 Windows 身份验证 表单身份验证的概念及其差异 我很困惑 有人可以帮我澄清这一点吗 Thanks Windows 身份验证Provider 是 ASP NET 应用程序的默认身份验证提供程序 当使用此身份验证的用户登录到应
  • 变量值由函数调用决定

    这可能很奇怪 但我想声明一个没有固定值的变量 但以某种方式 链接 到函数的结果 目标是让最终用户操作变量 但每次使用变量的值时 其值可能会发生变化 这是我得到的当前结果 from random import randint def rand
  • 如何根据 pandas 中另一列的条件生成具有值的新列

    我有一个如下数据框 我需要生成一个名为 Comment 的新列 对于指定的值 它应该显示 Fail Input Tel MC WT AAA Rubber 9999 BBB Tree 0 CCC Rub 12 AAA Other 20 BBB
  • 依赖项和latest.release

    我们目前使用 grails 2 2 并尝试升级到 2 4 但遇到了问题 在BuildConfig groovy中 我们有一些使用latest release的依赖项和插件 例如 com example myplugin latest rel
  • XCode 4.2 clang 段错误

    刚刚升级到 Lion 和 xcode 4 2 现在 当我重新编译程序时 我收到以下错误 Users XXX Code iPhone XXX Code Scenes GameScene mm 1806 35 current parser to
  • 在哪里可以访问 Django Rest Framework 中的请求参数?

    我使用 Django Rest Framework 和 python requests 并通过 URL 传递多个变量 如下所示 GET api boxobjects format json make Prusa model i3 plast
  • 如何符号化Xcode崩溃日志?

    Xcode 5 管理器有一个视图 可以列出所有崩溃日志 我们可以将崩溃日志拖放到此处 但从 Xcode 6 开始 我知道他们已经将设备移出了组织 并为其提供了一个新窗口 但我没有找到一个地方可以查看我在升级到 Xcode 6 后拖放到 Xc
  • Gmail Android 应用程序如何为邮件对话视图发挥 webview-header-overlay 的魔力?

    Using 层次结构查看器 http developer android com guide developing debugging debugging ui htmlGmail 对话视图上显示了一个有趣且不寻常的布局层次结构 All单个