gpt4 book ai didi

java - 如何通知跨度已更改的 EditText,而无需重新读取整个字符串

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:33 24 4
gpt4 key购买 nike

我正在编写一个 Android 应用程序,该应用程序的语法突出显示代码。目前,该应用的工作方式是获取一个字符串,将其转换为 new SpannableStringBuilder,然后根据文件扩展名通过 setSpan(new ForegroundColorSpan(...)) 为其着色。完成所有这些后,将使用构建器调用 EditText.setText。这种方法的问题在于,对于大文件,所有 setSpan 调用都需要相当长的时间,并且在调用 setText() 并显示文本之前,UI 会卡住 10 秒。

我想彻底修改这里的方法。我想首先对整个字符串调用 setText() ,以便立即显示文本(但未着色)。然后我想以 500 行为一组对文本进行着色,每批后刷新到显示屏上。用户可能不会注意到任何差异(除了性能之外),因为我处理 + 刷新 500 行的速度比用户向下滚动 500 行的速度快得多。

但是,我不确定如何有效地实现我的想法。通过更新显示来“刷新”更改的唯一方法是在向其附加更多跨度后再次调用 SpannableStringBuilder 上的 setText()setText() 反过来,当它只需要查看新的跨度时,会重新读取整个字符串及其所有跨度。是否可以告诉 EditText 仅重绘新的跨度?谢谢。

最佳答案

我当时就傻了。在问这个问题之前,我制作了这个测试应用程序(使用 Xamarin/C#):

protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);

SetContentView(Resource.Layout.Main);

var editText = FindViewById<EditText>(Resource.Id.EditText);
var ssb = new SpannableStringBuilder(new string('E', 250));
editText.SetText(ssb, TextView.BufferType.Editable);
ssb.SetSpan(new ForegroundColorSpan(Color.Blue), 0, ssb.Length(), SpanTypes.InclusiveExclusive);
}

当您运行应用程序时,所有文本都是白色的。我认为这是因为 EditText 忽略您在 SetText 之后所做的任何更改,并且您需要再次调用 SetText 以使更改生效。但是,我记得当您调用 SetText 时,EditText 默认情况下会复制您的 Editable,因此您必须事先添加以下内容:

editText.SetEditableFactory(new NoCopyEditableFactory());

private class NoCopyEditableFactory : EditableFactory // Editable.Factory in Java
{
public override IEditable NewEditable(ICharSequence source) => (IEditable)source;
}

现在,即使我在 SetText 之后调用 SetSpan,所有文本都是蓝色的。

关于java - 如何通知跨度已更改的 EditText,而无需重新读取整个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44641504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com