打电话给所有的Xamarin Android大师-这个问题是远远超过我的头。
我有一个Google Play App Store产品在beta测试中,它正在经历灾难性的,可重复的,数据丢失导致的故障,与Xamarin.Forms.WebView
相关仅限Android 13。请随意clone我的最小可重复的示例项目,具有Telerik.RadRichTextEditor
和Syncfusion.SfRichTextEditor
的单独分支。据我所知,这两个组件都 Package 了WebView
,WebView
又 Package 了对本机Android
控件的JavaScript调用。
我确实想强调的是,这在Android 12物理设备上已经工作了很长一段时间,没有任何问题。iOS项目也没有出现任何麻烦的迹象。
测试台很简单:单个页面上有一个编辑器,我们将一些HTML加载到该编辑器中。
克默尔
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:tkrtf="clr-namespace:Telerik.XamarinForms.RichTextEditor;assembly=Telerik.XamarinForms.RichTextEditor"
x:Class="reproduce_android_13_webview_issue.MainPage">
<Grid>
<tkrtf:RadRichTextEditor x:Name="rteditor"/>
</Grid>
</ContentPage>
C#
public MainPage()
{
InitializeComponent();
// rteditor.Source = TestHtml01; // PASS
rteditor.Source = TestHtml02; // FAIL
}
当点击控件并打开软键盘时会出现问题。它是否工作取决于html。
第一个html源代码的行为 * 正确 * 时,编辑器是在文本的末尾点击设置光标,并开始编辑。
public const string TestHtml01 =
@"<html>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam sagittis ante id eros aliquet faucibus.</p>
<p>Lore mi'ps umdol or si tame tc onse ct ETU etur adi piscinge lita liqu ams agitt is a NteIderOsew aliq ue.</p>
</body>
</html>";
log-pass-telerik.txt
但是,在html的末尾添加一个字符,当WebView试图滚动到字符位置时,* 整个文档将被删除 *。
// In this source, a single character is added at the end of paragraph 2.
public const string TestHtml02 =
@"<html>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam sagittis ante id eros aliquet faucibus.</p>
<p>Lore mi'ps umdol or si tame tc onse ct ETU etur adi piscinge lita liqu ams agitt is a NteIderOsew aliq uet.</p>
</body>
</html>";
log-fail-telerik.txt
我还应该提到,即使第一个html源代码在开始时正确打开,但尝试实际编辑文本会在文档中产生不稳定的扭曲。
SfRichTextEditor(对比)
使用SfRichTextEditor
,第一个html源代码仍然正常运行。带有额外字符的html仍然会改变(但不会破坏)文档数据。(从前导空格判断,似乎有不同的默认样式表。有“一些”差异似乎并不令人惊讶。)
log-fail-syncfusion.txt
log-pass-syncfusion.txt
我不知道这里发生了什么,我希望有内部知识的人可以提供一个解决方案,变通办法或至少是一个解释。当软输入打开并且高度改变时,它 * 闻起来 * 像是WebView试图ScrollToPosition。也许有一些字符串测量,其中字符索引可以转换为视图端口坐标。我的理由是,我排除了文本的长度作为问题。问题是,我可以在失败的源代码中将大写的'ETU'更改为小写的'etu',然后它就通过了。对我来说,这似乎是比例字体中的小写字母 * 更窄 *,即使字符数有 *,这也会产生差异。不管怎样,我花了几天时间才把这个隔离开来,我非常渴望得到一些见解,如果你有任何见解的话。
1条答案
按热度按时间ccgok5k51#
用于测试的Android 13物理设备于2023年3月26日执行了自动软件更新,并安装了One UI版本5.1,该版本似乎解决了
WebView
和HybridWebView
的问题。为了呼应ToolmakerSteve的优秀评论,“追求所有途径”。这样或那样(无论我是否对此制造噪音有任何不同)对问题的认识被提高到了在操作系统层面得到修复的程度。