召集所有 Xamarin-Android 专家 - 这个问题让我头疼。
我在 Beta 测试中有一个 Google Play App Store 产品正在经历灾难性的、可重复的、导致数据丢失的故障,这些故障与
Xamarin.Forms.WebView
仅在Android 13 上有关。随时 clone 我的最小可复制示例项目,带有 Telerik.RadRichTextEditor
和 Syncfusion.SfRichTextEditor
的单独分支。据我了解,这两个组件都包装了WebView
,后者又包装了对本机Android
控件的javascript调用。
我想强调的是,这已经在 Android 12 物理设备上运行了很长时间,没有任何问题。 iOS 项目也没有任何问题。
测试平台很简单:单个页面上有一个编辑器,我们将一些 html 加载到该编辑器中。
Xaml
<?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>";
但是,只在 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>";
我还应该提到,即使第一个 html 源在开始时正确打开,尝试实际编辑文本也会在文档中产生不稳定的扭曲。
SfRichTextEditor(对比)
随着
SfRichTextEditor
,第一个html源仍然表现正常。带有额外字符的 html 仍然会改变(但不会破坏)文档数据。 (从前导空格来看,似乎有一个不同的默认样式表。有“一些”差异似乎并不太令人惊讶。)
我不知道这里发生了什么,我希望有内部知识的人可以提供解决方案、解决方法或至少是一个解释。对我来说,推测,当软输入打开并且高度发生变化时,它闻起来就像 WebView 试图 ScrollToPosition 一样。也许有一些字符串测量值可以将字符索引转换为查看端口坐标。我的理由是我排除了文本的length问题。问题是,我可以将失败源中的大写“ETU”更改为小写“etu”,然后它通过。对我来说,这似乎是比例字体中的小写字母 narrower,即使字符数 not 改变,这也会有所不同。不管怎样,我花了几天时间才把它隔离开来,如果你有任何见解,我非常渴望得到一些见解。