Xamarin Android EditText换行文本获取与OnWrapped事件咨询
在Xamarin Android中获取EditText自动换行的格式化文本
在Xamarin Android里,EditText的自动换行纯粹是视觉上的排版效果——这些换行不会被自动写入文本的实际内容中,所以直接调用EditText.Text只能拿到用户手动输入的回车符,看不到那些自动换行的位置。不过我们可以通过两种实用的方式解决这个问题:
1. 手动计算换行位置,生成带换行符的文本
Android的EditText控件提供了获取每行文本范围的原生API,在Xamarin中可以通过GetLineStart(int lineIndex)和GetLineEnd(int lineIndex)方法来获取每一行的起始与结束字符索引。你可以遍历所有行,截取每行的文本内容,再用换行符\n拼接起来,就能得到和屏幕显示完全一致的带换行的文本了。
这里有个现成的C#代码示例:
public string GetDisplayFormattedText(EditText targetEditText) { var resultBuilder = new StringBuilder(); int totalLines = targetEditText.LineCount; for (int lineIndex = 0; lineIndex < totalLines; lineIndex++) { int lineStart = targetEditText.GetLineStart(lineIndex); int lineEnd = targetEditText.GetLineEnd(lineIndex); string currentLine = targetEditText.Text.Substring(lineStart, lineEnd - lineStart); resultBuilder.Append(currentLine); // 最后一行不需要额外添加换行符 if (lineIndex != totalLines - 1) { resultBuilder.Append("\n"); } } return resultBuilder.ToString(); }
需要注意的是,当EditText的尺寸发生变化(比如屏幕旋转、控件布局调整)时,自动换行的位置会跟着改变,所以要在合适的时机重新调用这个方法来更新文本。
2. 监听控件变化,实时同步换行信息
Android系统并没有提供直接的OnWrapped事件,但我们可以结合两个事件来实现类似的实时监听效果:
TextChanged:用户输入或修改文本时,内容变化可能导致换行位置改变SizeChanged:EditText的宽高尺寸变化时,换行排版也会随之调整
你可以在这两个事件的回调里,调用上面的方法重新计算格式化后的文本,或者记录每行的位置信息。示例代码如下:
// 初始化时绑定事件 targetEditText.TextChanged += HandleEditTextTextChanged; targetEditText.SizeChanged += HandleEditTextSizeChanged; // 文本变化回调 private void HandleEditTextTextChanged(object sender, Android.Text.TextChangedEventArgs e) { EditText editText = sender as EditText; if (editText == null) return; string formattedText = GetDisplayFormattedText(editText); // 在这里处理格式化后的文本,比如保存到变量、更新其他控件等 } // 尺寸变化回调 private void HandleEditTextSizeChanged(object sender, Android.Views.View.SizeChangedEventArgs e) { EditText editText = sender as EditText; if (editText == null) return; if (e.WidthChanged || e.HeightChanged) { string formattedText = GetDisplayFormattedText(editText); // 处理尺寸变化后的换行文本更新 } }
这种方式的核心思路是:因为EditText不会自动保存视觉换行的位置,所以我们只能通过计算每行的字符范围,手动将视觉换行转换为实际的换行符,以此来得到和显示一致的格式化文本。
内容的提问来源于stack exchange,提问作者A. Schmidt
相关产品推荐
相关产品推荐

