Android 如何增加文本视图中段落之间的间距

Android 如何增加文本视图中段落之间的间距,android,textview,Android,Textview,我有一些包含多个段落的文本(使用“\n”),希望在段落之间留出间距,但不使用“\n\n”。但是同一段落的文本我想保留较低的空间 我尝试使用lineSpacingExtra和lineSpacingMultiplier,但它为每一行设置了空格(也在段落中) 我想要这样的东西: 您可以使用 Html.fromHtml(String); 这将帮助您以html的形式编写字符串,您可以使用html标记,如,等 例如: myTextView.setText(Html.fromHtml(这是第一个段落。这是第

我有一些包含多个段落的文本(使用“\n”),希望在段落之间留出间距,但不使用“\n\n”。但是同一段落的文本我想保留较低的空间

我尝试使用
lineSpacingExtra
lineSpacingMultiplier
,但它为每一行设置了空格(也在段落中)

我想要这样的东西:

您可以使用

Html.fromHtml(String);
这将帮助您以html的形式编写字符串,您可以使用html标记,如

例如:

myTextView.setText(Html.fromHtml(这是第一个
段落。

这是第二个
段落。

);
您可以使用Spanable来实现这一点:

String formattedText = text.replaceAll("\n", "\n\n");
SpannableString spannableString = new SpannableString(formattedText);

Matcher matcher = Pattern.compile("\n\n").matcher(formattedText);
while (matcher.find()) {
    spannableString.setSpan(new AbsoluteSizeSpan(25, true), matcher.start() + 1, matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}

上面的代码将所有换行符替换为两个换行符。之后,它会为每一个第二个换行设置绝对大小。

我担心它在TextView中无法调整。以下是所有TextView属性的文档: 我想最好的方法是为每个段落使用一个TextView,然后定义TextView之间的边距


我认为这是一个类似于html中的p标记的设计概念。标签中有一整段,然后定义p标签的布局。

我也遇到过类似的问题。最后,我修复了换行符的可扩展文本。下面是代码

    String text ="Lorem ipsum dolor sit amet, End of first line.\nBegining of the second line, Aenean justo mi, faucibus eu suscipit id, finibus gravida quam. End of Second Line.\nBegining of the third line, Aliquam ac diam tempus, pharetra nibh at, imperdiet diam.  End of Third Line.\n Begining of the fourth line, Fusce placerat erat dolor, id tristique lacus gravida ac. End of Fourth Line.\nBegining of the Fifth line, Sed id molestie est, sed elementum lectus.  End of Fifth Line.\n";

    text = text.replace("\n","\n\0");
    Spannable spannable = new SpannableString(text);
    for (int i = 0; i < text.length()-1; i++) {
        if (text.charAt(i) == '\n') {
            spannable.setSpan(new RelativeSizeSpan(1.5f), i+1, i+2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
    mTextMessage.setText(spannable, TextView.BufferType.SPANNABLE);
字符串文本=“Lorem ipsum dolor sit amet,第一行的末尾。\n第二行开始,Aenean justo mi,faucibus eu suscipit id,finibus Gradida quam。第二行结束。\n第三行开始,Aliquam ac diam tempus,pharetra nibh at,imperdiet diam。第三行结束。\n第四行开始,第四行结束。\n第五行开始,第三行结束,第五行结束,第三行结束。第五行结束。\n“;
text=text.replace(“\n”,“\n\0”);
Spannable Spannable=新的SpannableString(文本);
对于(int i=0;i
无需操纵段落之间的间距

FROM_HTML_MODE_LEGACY:使用空行(两个换行符)分隔块级元素。这是N之前的遗留行为

对于我来说,这不起作用,但基本思想是正确的,添加一条空行并更改其高度可以得到预期的结果。但是,在我的情况下,更改行高度的工作方式如下所示:

private fun insertParagraphSpacing(text: CharSequence, spacing: Int): CharSequence {
    val stringBuilder = SpannableStringBuilder(text)

    Regex(lineSeparator()).findAll(text).forEachIndexed { index, match ->
      val span = ParagraphSpacingSpan(lineHeight, spacing)

      val separator = SpannableString(lineSeparator())
      separator.setSpan(span, 0, separator.length, SPAN_EXCLUSIVE_EXCLUSIVE)

      stringBuilder.insert(match.range.last + 1 + index * separator.length, separator)
    }

    return stringBuilder
  }
class ParagraphSpacingSpan(
  @Px @IntRange(from = 1) val lineHeight: Int,
  @Px @IntRange(from = 0) val spacing: Int
) : LineHeightSpan {

  override fun chooseHeight(t: CharSequence, s: Int, e: Int, v: Int, l: Int, fm: FontMetricsInt) {
    val textHeight: Int = fm.descent - fm.ascent

    fm.descent = textHeight - lineHeight + spacing
    fm.ascent = 0
  }
}
段落Spacingspan
的实现如下:

private fun insertParagraphSpacing(text: CharSequence, spacing: Int): CharSequence {
    val stringBuilder = SpannableStringBuilder(text)

    Regex(lineSeparator()).findAll(text).forEachIndexed { index, match ->
      val span = ParagraphSpacingSpan(lineHeight, spacing)

      val separator = SpannableString(lineSeparator())
      separator.setSpan(span, 0, separator.length, SPAN_EXCLUSIVE_EXCLUSIVE)

      stringBuilder.insert(match.range.last + 1 + index * separator.length, separator)
    }

    return stringBuilder
  }
class ParagraphSpacingSpan(
  @Px @IntRange(from = 1) val lineHeight: Int,
  @Px @IntRange(from = 0) val spacing: Int
) : LineHeightSpan {

  override fun chooseHeight(t: CharSequence, s: Int, e: Int, v: Int, l: Int, fm: FontMetricsInt) {
    val textHeight: Int = fm.descent - fm.ascent

    fm.descent = textHeight - lineHeight + spacing
    fm.ascent = 0
  }
}

lineHeight
是显示行的
TextView
字段的值。

如果您希望对段落之间的间距进行如此大的控制,最好将第二段放在另一个TextView中,并用边距和填充隔开。问题是我不知道有多少段落将有文本。我想知道有没有更简单的方法来添加空格,而不在文本视图之间添加空白。你在问题中发布的图像是你应该从
\n\n
中得到的。因此,如果你没有得到,那么另一件事是错误的。图像是简单的表示法…问题是我的方式请阅读“我想在段落之间留出间距,但不使用\n\n”“我想你没有读到我的问题。我想要不同的间距,如果它的不同行来自相同的段落或不同的段落\n\n当前间距太大,希望对其进行编辑。明白吗?不是为我工作。这会减小行中文本的大小,但不会减小行的大小。