如何使用按钮中的重量来对齐左侧的文本和右侧的图标

Day*_*Day 6 android android-layout android-jetpack-compose android-compose-button android-jetpack-compose-button

我正在 Jetpack Compose 中构建一个可重用的 Button 组件,它基本上是一个Row. 该按钮的左端应有文本,右端应有图标。这可以直接像这样工作:

@Composable
fun MyButton(
    text: String,
    modifier: Modifier = Modifier
) {
    Button(
        onClick = { /* */ },
        modifier = modifier
    ) { // RowScope
        Text(
            text = text
        )
        Spacer(modifier = Modifier.width(8.dp))
        Icon(
            painter = painterResource(
                id = android.R.drawable.ic_dialog_info
            ),
            contentDescription = null
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果按钮应用固定宽度,则文本和图标将居中而不是在左/右端。

在此输入图像描述

所以我尝试添加modifier = Modifier.weight(1F)到,Text以便它填满任何额外的空间。但这会导致没有固定宽度的按钮占用尽可能多的空间。

在此输入图像描述

如何构建一个可在两种情况下工作的 Compose 组件:定义宽度时和换行到内容时?

我的屏幕布局:

@Composable
fun MyScreen() {
    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.fillMaxSize()
    ) {
        Spacer(modifier = Modifier.height(8.dp))
        MyButton(
            text = "variable width",
            modifier = Modifier.wrapContentWidth()
        )
        Spacer(modifier = Modifier.height(8.dp))
        MyButton(
            text = "fixed width",
            modifier = Modifier.width(300.dp)
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

Gab*_*tti 5

a 的内容Button是 a RowScope。只需将weight(1f)修饰符应用于Textwith即可TextOverflow.Ellipsis

就像是:

Button(
    onClick = { /* */ },
    modifier = modifier.width(IntrinsicSize.Max)
) { // RowScope
    Text(
        text = text,
        maxLines = 1,
        modifier = Modifier.weight(1f),
        overflow = TextOverflow.Ellipsis
    )
    Spacer(modifier = Modifier.width(8.dp))
    Icon(
        painter = painterResource(
            id = android.R.drawable.ic_dialog_info
        ),
        contentDescription = null
    )
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述