You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:25:26