我正在使用一个 EditText 控件,我允许使用(粗体、斜体等)的文本格式。
要应用格式,在我的 TextWatcher 的 AfterTextChanged 事件处理程序中,我检测是否已通过 UI 切换了格式样式(例如粗体)。如果是这样,我尝试了两种不同的方法,但由于不同的原因,这两种方法都不令人满意:
方法一
textView.EditableText.SetSpan(new StyleSpan(TypefaceStyle.Bold), start, end, SpanTypes.ExclusiveExclusive);
对于起始值,我尝试使用_textView.SelectionStart - 1或首次应用 StyleSpan 时的起始位置。而对于最终值_textView.SelectionStart。
尽管使用此方法文本的格式看起来很好,但当只有一个就足够时,它会创建不必要的 StyleSpan。当我尝试通过 Html 转换将文本保存到本地数据库时,这一点很清楚:
string html = Html.ToHtml(new SpannableString(Fragment_Textarea.Instance().Textarea().EditableText));
例如,<b>this is bold text</b>
我得到的是 ,而不是<b><b><b><b><b><b><b><b><b><b><b><b><b><b><b><b><b>this is bold text</b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b>
。所以,很明显,我在这种方法中做错了/效率低下。显然,这导致在输入文本和启动时检索时最终都会变慢。
我考虑过的是检查前一个_textView.SelectionStart - 1
字符_textView.SelectionStart
(检查/删除/添加必要的跨度。但这似乎是另一种处理此问题的低效方法。
方法二
textView.EditableText.SetSpan(new StyleSpan(TypefaceStyle.Bold), start, end, SpanTypes.ExclusiveInclusive);
因此,这不会导致与上述相同的低效率,但是由于该SpanTypes.ExclusiveInclusive
标志,当我通过 UI 将其关闭时,我无法停止样式格式化以结束。换句话说,当我打开粗体样式时,后面的所有文本都将被格式化为粗体样式,即使我已经关闭了它的切换。
在这两者中,在我看来,这似乎是正确的一般方法,所以我想知道我是否可以做任何事情来阻止在我关闭其切换时立即应用该样式。还是有另一种我完全错过的方法作为处理此类要求的最佳实践。