【问题标题】:Why TextView breaks line when width of line is equal to width of TextView为什么当行的宽度等于TextView的宽度时TextView会换行
【发布时间】:2019-11-19 07:59:21
【问题描述】:

我有一个TextView,它的textSize3。我想在其中显示这个字符串:

String line = 
لورم  ایپسوم  متن  ساختگی  با  تولید  سادگی  نامفهوم  از  صنعت  چاپ و با استفاده از طراحان گرافیک است. چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد نیاز و کاربردهای متنوع با هدف بهبود;

我通过实现ViewTreeObserver.OnGlobalLayoutListener 接口在运行时为文本计算TextView 的可用宽度:

int textAreaWidth;
@Override
public void onGlobalLayout() {
    textAreaWidth = textView.getWidth() - (textView.getPaddingLeft() + textView.getPaddingRight());
}

我也像这样计算line 的宽度:

TextPaint textPaint = textView.getPaint();
float lineWidth = textPaint.measureText(line);

Logcat 我可以看到textAreaWidthlineWidth 的值:

textAreaWidth > 668
lineWidth > 668.0

如您所见,textAreaWidthlineWidth 相等,但 TextViewline 分成 2 行并显示它们:

لورم  ایپسوم  متن  ساختگی  با  تولید  سادگی  نامفهوم  از  صنعت  چاپ و با استفاده از طراحان گرافیک است. چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد نیاز و کاربردهای متنوع با هدف 
بهبود

为什么TextView 会中断line 而行的宽度等于文本的可用宽度?

【问题讨论】:

    标签: android text textview


    【解决方案1】:

    我将其添加为答案而不是评论,因为它相对深入,但不幸的是我对您的问题没有准确的答案。

    我通常使用两种不同的方法来测量文本:

    • TextPaint.measureText()
    • TextPaint.getTextBounds()

    根据我的个人经验,第一个在准确测量文本宽度方面做得更好,第二个在准确测量文本高度方面做得更好。

    然而,这两种方法都没有完美地衡量文本所需的精确大小(即文本适合的最小边界框)并且这两种方法都没有给出与 TextView 相同的答案用途。

    我(诚然有限)的理解是 TextView 使用 StaticLayoutDynamicLayout 类来测量文本。在对这些课程进行了非常简要的研究之后,我没有看到一个明显的方法来回答“这个文本有多宽”;相反,他们似乎更擅长回答“在给定 N 个宽度像素的情况下,该文本将有多少行”。

    希望这有助于为您指明正确的方向。

    【讨论】:

    • 谢谢。你清除了话题。但是textPaint.breakText 呢?我用这个:int countedChars = textPaint.breakText(line, 0, line.length(), true, textAreaWidth, measuredWidth); 然后Log.i("justification", "not countedChars: " + (line.length() - countedChars) + " (\"" + line.substring(countedChars) + "\")"); Log.i("justification", "measuredWidth: " + measuredWidth[0]); 输出是:not countedChars: 1 ("د") measuredWidth: 668.0 看来这个方法可以理解整个line 是长的TextView。我说的对吗?
    • 我对@9​​87654334@ 没有任何经验,抱歉。如果它对您有用,那么您发布的内容对我来说似乎是合理的。
    【解决方案2】:

    如果你希望它是单行,那么使用 TextView 的 maxlines 属性:

    android: maxLines="1"
    

    【讨论】:

      猜你喜欢
      • 2011-12-25
      • 2016-04-01
      • 2011-11-10
      • 2015-07-11
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多