Android / Programming

TextFieldに文字を入力すると高さが変わる時の解決方法

Jetpack ComposeのTextFieldやBasicTextFieldで、文字の入力を行うとコンポーネントの高さが勝手に変わる問題の解決方法です

解決したいこと

文字入力で高さが変わる問題を解消したい

解決方法

TextFieldやBasicTextFieldのtextStyleパラメーターに下記の設定をします
・lineHeight = fontSizeの1.5倍
・lineHeightStyle = LineHeightStyle(alignment = LineHeightStyle.Alignment.Proportional, trim = LineHeightStyle.Trim.None)
・platformStyle = PlatformTextStyle(includeFontPadding = false)
例えば、文字の大きさを25.spに設定したい場合は下記のような設定を行います

    TextField(
        value = title,
        onValueChange = { title = it },
        modifier = modifier
            .fillMaxWidth(),
        textStyle = LocalTextStyle
            .current
            .copy(
                fontSize = 25.sp,
                lineHeight = 37.sp, // 25 * 1.5 = 37.5 -> 37 or 38
                letterSpacing = 0.sp,
                lineHeightStyle = LineHeightStyle(
                    alignment = LineHeightStyle.Alignment.Proportional,
                    trim = LineHeightStyle.Trim.None
                ),
                platformStyle = PlatformTextStyle(
                    includeFontPadding = false
                ),
            ),
        placeholder = {
            Text(
                text = "タイトル",
                modifier = Modifier
                    .fillMaxWidth(),
                style = LocalTextStyle
                    .current
                    .copy(
                        fontSize = 25.sp,
                        lineHeight = 37.sp, // 25 * 1.5 = 37.5 -> 37 or 38
                        letterSpacing = 0.sp,
                        lineHeightStyle = LineHeightStyle(
                            alignment = LineHeightStyle.Alignment.Proportional,
                            trim = LineHeightStyle.Trim.None
                        ),
                        platformStyle = PlatformTextStyle(
                            includeFontPadding = false
                        ),
                    ),
            )
        },
    )

これで勝手に高さが変わらなくなります
上記の方法だと毎回書く必要があるので、下記のようにType.ktのTypographyに設定してそれを適用する方が可読性が上がります

// Type.kt

val Typography = Typography(
    titleLarge = TextStyle(
        fontSize = 25.sp,
        lineHeight = 37.sp,
        lineHeightStyle = LineHeightStyle(
            alignment = LineHeightStyle.Alignment.Proportional,
            trim = LineHeightStyle.Trim.None
        ),
        platformStyle = PlatformTextStyle(
            includeFontPadding = false
        ),
    ),
)
    TextField(
        value = title,
        onValueChange = { title = it },
        modifier = modifier
            .fillMaxWidth(),
        textStyle = MaterialTheme
            .typography
            .titleLarge,
        placeholder = {
            Text(
                text = "タイトル",
                modifier = Modifier
                    .fillMaxWidth(),
                style = MaterialTheme
                    .typography
                    .titleLarge,
            )
        },
    )

今回の内容に関する内容でも、そうでなくても、質問や疑問点があればお気軽にコメントまでお願いします

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です