【问题标题】:How to vertically align the text and leading/trailing icons in a TextField如何垂直对齐文本字段中的文本和前导/尾随图标
【发布时间】:2021-11-26 20:42:59
【问题描述】:

有没有办法将尾随/前导图标和文本设置在同一级别?默认情况下,它不是如下图所示。我尝试更改TextField 中的fontStyle 参数,但没有成功。文字显示高于图标

import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.Icon
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowForward
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.window.singleWindowApplication

fun main() = singleWindowApplication {
    var text by remember { mutableStateOf("TEXT") }
    
    OutlinedTextField(
        value = text,
        onValueChange = { text = it },
        modifier = Modifier.fillMaxWidth(),
        leadingIcon = {
            Icon(contentDescription = null,
                 imageVector = Icons.Default.ArrowForward)
        },
        trailingIcon = {
            Icon(contentDescription = null,
                 imageVector = Icons.Default.ArrowForward)
        })
}

【问题讨论】:

    标签: kotlin android-jetpack-compose compose-desktop


    【解决方案1】:

    有几种解决方案。对于桌面 Compose,偏移图标。对于移动 Compose,调整基线。最后,只需创建一个自定义 TextField。

    图标底部可能有额外的填充。也可能是图标和文本始终与顶部对齐。您可以将图标替换为没有底部填充的图标或向上移动图标。您可以看出图标正在影响垂直对齐,因为如果您注释掉图标,文本会垂直居中。您也可以尝试减小图标的大小。

    在桌面 Compose 上,向上移动图标:

    OutlinedTextField(
         value = text,
         onValueChange = { text = it },
         modifier = Modifier.fillMaxWidth(),
         leadingIcon = {
              Icon(
                    modifier = Modifier.offset(y = -3.dp),
                    contentDescription = null,
                    imageVector = Icons.Default.ArrowForward
              )
         },
         trailingIcon = {
              Icon(
                    modifier = Modifier.offset(y = -3.dp),
                    contentDescription = null,
                    imageVector = Icons.Default.ArrowForward
              )
         })
    

    在移动设备上,可以调整文字的baseline

    OutlinedTextField(
        value = text,
        textStyle = TextStyle(baselineShift = BaselineShift(-0.2f)),
        onValueChange = { text = it },
        modifier = Modifier.fillMaxWidth(),
        leadingIcon = {
            Icon(
                contentDescription = null,
                imageVector = Icons.Default.ArrowForward
            )
        },
        trailingIcon = {
            Icon(
                contentDescription = null,
                imageVector = Icons.Default.ArrowForward
            )
        })
    

    这里还有一个自定义的TextField:

    class MainActivity : ComponentActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            setContent {
                CustomTextField(
                    initialText = "cool",
                    onValueChange = {
    
                    },
                    onLeftButtonClick = {
    
                    },
                    onRightButtonClick = {
    
                    }
                )
            }
        }
    }
    
    @Composable
    fun CustomTextField(
        initialText: String,
        onValueChange: (text: String) -> Unit,
        onLeftButtonClick: () -> Unit,
        onRightButtonClick: () -> Unit
    ) {
    
        var text by remember { mutableStateOf(initialText) }
    
        Row(
            modifier = Modifier
    
                .fillMaxWidth()
                .wrapContentSize()
                .background(color = Color.White, shape = RoundedCornerShape(8.dp))
    
                .border(width = 1.dp, shape = RoundedCornerShape(8.dp), color = Color(0xFF585858))
        ) {
    
            ConstraintLayout(
                modifier = Modifier.fillMaxWidth()
            ) {
    
                val (left, mid, right) = createRefs()
    
                IconButton(onClick = onLeftButtonClick,
                    modifier = Modifier.constrainAs(left) {
                        start.linkTo(parent.start, margin = 10.dp)
                        top.linkTo(parent.top)
                        bottom.linkTo(parent.bottom)
                    }) {
                    Icon(
                        contentDescription = null,
                        imageVector = Icons.Default.ArrowForward,
                    )
                }
    
    
                IconButton(onClick = onRightButtonClick,
                    modifier = Modifier.constrainAs(right) {
                        end.linkTo(parent.end, margin = 10.dp)
                        top.linkTo(parent.top)
                        bottom.linkTo(parent.bottom)
                    }) {
                    Icon(
                        contentDescription = null,
                        imageVector = Icons.Default.ArrowForward,
                    )
                }
    
                TextField(
                    value = text,
                    onValueChange = {
                        text = it
                        onValueChange(it)
                    },
                    colors = TextFieldDefaults.textFieldColors(
                        backgroundColor = Color.White
                    ),
                    modifier = Modifier
                        .offset(y = 4.dp)
                        .constrainAs(mid) {
                            start.linkTo(left.end, margin = 10.dp)
                            top.linkTo(parent.top)
                            end.linkTo(right.start, margin = 10.dp)
                            bottom.linkTo(parent.bottom)
                            width = Dimension.fillToConstraints
                        })
            }
        }
    

    【讨论】:

    • 我按照您的建议调整了基线,但它并没有改变任何东西。也尝试了更高的值,但保持不变
    • 我只在它工作的移动设备上尝试过。它可能不适用于桌面版 Compose。
    • 我更新了代码以显示桌面应用程序的替代解决方案。
    • 谢谢,我会这样做,直到有东西可以自动垂直对齐所有东西
    • 我还添加了一个自定义 TextField 作为替代解决方案。您对此拥有完全的控制权。
    猜你喜欢
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2017-07-14
    • 2021-08-24
    相关资源
    最近更新 更多