【发布时间】:2020-03-22 00:07:43
【问题描述】:
总结
我有一个字符串[tab] [ch]C[/ch] [ch]Am[/ch] \n I heard there was a secret chord[/tab]
当 TextView 大到足以容纳它而不进行包装时,它应该(并且确实)看起来像这样:
C Am
I heard there was a secret chord
当行太长而无法放入 TextView 时,我希望它像这样换行:
C
I heard there was a
Am
secret chord
现在它是这样换行的(就像你期望的那样,如果它只是文本)
C
Am
I heard there was a
secret chord
约束:
- 我使用等宽文本字体来保持对齐
- 和弦(
C、F、Am、G)是可点击的,因此如果您自定义实现 TextView,它仍然必须能够处理ClickableSpans或以其他方式保持它们可点击 - Kotlin 或 Java(或 XML)都可以
如果有帮助,这是我的一个开源项目,所以源代码可以在 Github 上找到。这是fragment source(查找fun processTabContent(text: CharSequence)——我现在正在处理文本。这是layout xml。
输入格式
我的数据存储在单个字符串中(无法更改——我从 API 获取)。以下是上述选项卡的格式:
[Intro]\n[tab][ch]C[/ch] [ch]Am[/ch] [ch]C[/ch] [ch]Am[/ch][/tab]\n[Verse 1][tab] [ch]C[ch] [ch]Am[/ch] I heard there was a secret chord [/tab][tab] [ch]C[/ch] [ch]Am[/ch]\nThat David played, and it pleased the Lord[/tab][tab] [ch]C[/ch] [ch]F[/ch] [ch]G[/ch]\n But you don't really care for music, do you?[/tab]
请注意,和弦(吉他手会演奏的音符,如C 或F)被包裹在[ch] 标签中。我目前有找到这些的代码,删除[ch] 标签,并将每个和弦包装在ClickableSpan 中。单击时,我的应用程序会显示另一个片段,其中包含如何在吉他上弹奏和弦的说明。这一点很重要,因为这个问题的答案必须允许这些和弦仍然像这样被点击。
我现在在做什么(那行不通)
您现在可能已经注意到,对于这个问题,我们将不得不关注[tab] 标签。现在,我正在遍历字符串并将[tab] 替换为换行符并删除[/tab] 的所有实例。如果我的TextView 的文本大小足够小以使整行适合设备屏幕,则此方法可以正常工作。但是,当自动换行开始时,我开始遇到问题。
这个:
C Am
I heard there was a secret chord
应该换成这样:
C
I heard there was a
Am
secret chord
而是像这样包装:
C
Am
I heard there was a
secret chord
【问题讨论】:
-
当前想法:stackoverflow.com/questions/41779934/… 和 stackoverflow.com/questions/42219292/… 结合起来可能会奏效,但我没有足够的经验来适应它。
-
仅供参考,我的 TextView 还包含这些和弦的 ClickableSpan,因此答案必须允许保留这些跨度。
-
对不起,我在 android 上很不错,但在吉他指法上不行。我需要一些关于指法的基本信息,比如什么是 C、Am、F 和 G?。你的数据结构是什么?和弦和单词是单个字符串还是映射或数组格式?
-
你能显示一些数据 xml 你是如何显示的
-
@Heisenberg 好问题。我用 TL;DR 更新了问题并添加了该信息。基本上,
C、Am、F和G告诉吉他手要弹什么音符。吉他手可以通过结束的单词来判断何时播放该音符。对于数据结构,整个选项卡都在一个巨大的字符串中,包括和弦和歌词。但是,它的格式是[ch]/[/ch]标签包裹在和弦周围,[tab]/[/tab]标签包裹在应该被包裹在一起的一组行(一行和弦和一个歌词)周围。希望对您有所帮助。
标签: java android kotlin textview word-wrap