概要
Jetpack Compose の LineBreak を設定すると、長いテキストで改行を挿入するタイミングを調整することができます。
以下にコード付きのドキュメントがあります。
https://developer.android.com/reference/kotlin/androidx/compose/ui/text/style/LineBreak
ところが以下のようなコードを実行してみたところ
@Composable
@Preview
fun TestView() {
Text(
text = "こちらはいい感じのところで改行して欲しい文章です。よろしくお願いします。",
style = TextStyle(lineBreak = LineBreak.Heading),
fontSize = 22.sp,
)
}
Preview でいい感じに改行表示されているものの、実機(Android 11)では改行位置が調整されていない形になってしまいました。
Preview | 実機(Android 11) |
---|---|
この原因ついて調査してみました。
原因
StaticLayoutFactory23 に以下のような実装があります。
private class StaticLayoutFactory23 : StaticLayoutFactoryImpl {
@DoNotInline
override fun create(params: StaticLayoutParams): StaticLayout {
return Builder.obtain(params.text, params.start, params.end, params.paint, params.width)
.apply {
setTextDirection(params.textDir)
setAlignment(params.alignment)
setMaxLines(params.maxLines)
setEllipsize(params.ellipsize)
setEllipsizedWidth(params.ellipsizedWidth)
setLineSpacing(params.lineSpacingExtra, params.lineSpacingMultiplier)
setIncludePad(params.includePadding)
setBreakStrategy(params.breakStrategy)
setHyphenationFrequency(params.hyphenationFrequency)
setIndents(params.leftIndents, params.rightIndents)
if (Build.VERSION.SDK_INT >= 26) {
StaticLayoutFactory26.setJustificationMode(this, params.justificationMode)
}
if (Build.VERSION.SDK_INT >= 28) {
StaticLayoutFactory28.setUseLineSpacingFromFallbacks(
this,
params.useFallbackLineSpacing
)
}
if (Build.VERSION.SDK_INT >= 33) {
StaticLayoutFactory33.setLineBreakConfig(
this,
params.lineBreakStyle,
params.lineBreakWordStyle
)
}
}.build()
....略
上記のコードの setLineBreakConfig は Build.VERSION.SDK_INT >= 33、つまり Android 13 以上でないと実行されません。これが原因だったようです。
過去バージョンのためのバックポート実装が欲しいところですが、compose-bom 2024.02.02 の時点では特にないようでした。