2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Jetpack Compose の Linebreak が反映されない

Posted at

概要

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)
TestApplication2_–MainActivity_kt__TestApplication2_app_main.png TestApplication2_–MainActivity_kt__TestApplication2_app_main.png

この原因ついて調査してみました。

原因

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 の時点では特にないようでした。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?