【问题标题】:Android Textview altering line spacing/paddingAndroid Textview改变行距/填充
【发布时间】:2019-07-05 10:08:33
【问题描述】:

我正在尝试在底部表单对话框中创建一个文本视图,示例布局如下所示。我已将所需的格式说明放在括号中 大多数跨行文本(粗体、下划线等)都很容易创建

使用 "\n\n" 可以轻松实现 2 的行距,但是如何在某些行之间创建 1.5 行距?我正在使用 append(...) 动态添加文本,所以我不能在布局 xml 中使用 android:text 属性。我见过的大多数示例都将行间距硬连接到 xml 中,这适用于所有文本。我发现您可以为段落应用不同的行距,但是“\n”会破坏段落并且不同的行距将不起作用。

title (underlined, bold, very large)
(linespace 1.5)
blurb
(linespace 2)
sub-section1 (underlined, bold, large)
(linespace 1.5)
ClickableSubheading1 
(linespace 1.5)
clickableSubheading2
(linespace 1.5)
[could be many more subheadings here...]

(linespace 2)
sub-section2 (underlined, bold, large)
(linespace 1.5)
ClickableSubheading1a 
(linespace 1.5)
clickableSubheading2a
(linespace 1.5)
[could be many more subheadings here...]


etc - more subsections to be added as and when needed

注意:可点击的子标题将代码隐式应用到应用程序中,而不是超链接(我曾考虑将全部内容作为 html 进行,然后将其读入我的 textview 中) 基本上,我需要的是一个跨度或类似的内容,上面写着“在这里放一个换行符,m 次 '\n'”,其中 'm' 可以是任何值

【问题讨论】:

  • android:lineSpacingMultiplier='1.5'
  • 欲了解更多信息,请访问以下链接stackoverflow.com/questions/6863974/…
  • 我认为这将适用于文本视图中的所有文本
  • 是的,你想要 1 个带有文本变体的文本视图吗?
  • 是的,这正是我所要求的。双倍和 1.5 行间距的变化

标签: android textview


【解决方案1】:

您可以使用RelativeSizeSpan 将第二个'\n' 的大小缩放到更小的值。

喜欢

// I try to find all '\n\n' in TextView then I resize the second \n size to 0.5
private fun beautifulParagraph(textView: TextView) {
    val text = textView.text
    var startIndex = 0
    val sb = SpannableString(text)
    var index: Int
    while (text.indexOf("\n\n", startIndex).also { index = it } != -1) {
        sb.setSpan(RelativeSizeSpan(0.5f), index + 1, index + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        startIndex = index + 2
    }
    textView.text = sb
}

使用

beautifulParagraph(yourTextView)

XML

<TextView
        android:id="@+id/tv_heelo"
        android:layout_width="150dp"
        android:layout_height="match_parent"
        android:text="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\nbbbbbbbbbbbbbbbnbbbbbbbbbbbbbbbnbbbbbbbbbbbbbbbnbbbbbbbbbbbbbbb\n\nccccccccccccccccnccccccccccccccccnccccccccccccccccnccccccccccccccccncccccccccccccccc\n\nddd"
        android:textSize="15sp"
        android:layout_margin="20dp"
        android:background="#000"
        android:textColor="#fff"
/>

结果(不调整大小和调整大小)

------>

【讨论】:

  • 谢谢,这很有趣。我不认为相对大小跨度适用于“\ n”?如果是这样,我可以这样做: SpannableString string = new SpannableString("\n"); string.setSpan(new RelativeSizeSpan(1.5f), 0,1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  • 我试过了,但效果不好。这很难解释,你可以尝试一下然后你就会看到问题并理解为什么^^。它的工作方式与我们的预期不同
  • 我对您的解决方案的唯一问题是我的文本充满了显示下划线、粗体等和 onClick 运算符的跨度,我不知道这种文本后处理效果如何工作。
  • 我还是不明白你为什么不能申请。您知道如何将多个类型跨度设置为 1 个跨度,现在只需在当前跨度中添加 1 个类型(RelativeSpan)。在我的回答中,我编写了一个仅在这种情况下易于使用的函数,但基本思想只是 relativespan
  • 实际上,看起来我可以使用它,或者它的变体。谢谢!
【解决方案2】:
  1. 您可以在 XML 中使用 lineSpacingExtra 和 lineSpacingMultiplier 文件。
  2. 您可以使用 Span 在 textview 中自定义您想要的内容 https://developer.android.com/guide/topics/text/spans

  3. 或者您可以在 HTML 中自定义您想要的内容并在 TextView 中显示 HTML

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        textView.setText(Html.fromHtml(htmlString, Html.FROM_HTML_MODE_COMPACT));
    } else { 
        textView.setText(Html.fromHtml(htmlString));
    }
    

这些我能给你什么建议。

【讨论】:

  • 它们不会应用于文件中的所有文本吗?我需要特定行的特定行距。
  • @user3713442 我编辑了我的答案,我添加了另外 2 条建议,希望你能找到问题的答案。
猜你喜欢
  • 2018-11-22
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2011-11-10
  • 1970-01-01
相关资源
最近更新 更多