Сводка
У меня есть строка [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. Вот источник фрагмента (ищите fun processTabContent(text: CharSequence)
- вот где я сейчас обрабатываю текст. Вот макет 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