我有一个OutlinedTextField,其中包含DropdownMenu,我希望在按下DropdownMenu列表中的项目后,该项目的值开始在OutlinedTextField中,也根据文本的长度通过宽度进行调整。如何做到这一点?
更新(2022年2月14日)
默认情况下,OutlinedTextField***使用***OutlinedTextFieldLayout,其中包含具有*defaultMinSize*修饰符参数BasicTextField
BasicTextField(
value = value,
modifier = modifier
.then(
if (decoratedLabel != null) {
Modifier.padding(top = OutlinedTextFieldTopPadding)
} else {
Modifier
}
)
.defaultMinSize(
minWidth = MinWidth,
minHeight = MinHeight
)
...
/** The default min width applied for a TextField and OutlinedTextField. Note that you can override it by applying Modifier.widthIn directly on a text field. */
val MinWidth = 280.dp
要使宽度为Intrinsic Min,我必须从Compose库中复制3个文件(TextField.kt、TextFieldImpl.kt、OutlinedTextField.kt),并在OutlinedTextFieldLayout组件中使用这些更改创建我自己的OutlinedTextField:
@Composable
internal fun OutlinedFormTextFieldLayout(
modifier: Modifier,
value: TextFieldValue,
onValueChange: (TextFieldValue) -> Unit,
enabled: Boolean,
readOnly: Boolean,
keyboardOptions: KeyboardOptions,
keyboardActions: KeyboardActions,
textStyle: TextStyle,
singleLine: Boolean,
maxLines: Int = Int.MAX_VALUE,
visualTransformation: VisualTransformation,
interactionSource: MutableInteractionSource,
decoratedPlaceholder: @Composable ((Modifier) -> Unit)?,
decoratedLabel: @Composable (() -> Unit)?,
leading: @Composable (() -> Unit)?,
trailing: @Composable (() -> Unit)?,
leadingColor: Color,
trailingColor: Color,
labelProgress: Float,
indicatorWidth: Dp,
indicatorColor: Color,
cursorColor: Color,
shape: Shape
) {
val textWidth = remember { mutableStateOf(0) }
val labelSize = remember { mutableStateOf(Size.Zero) }
fun Modifier.widthIntrinsicSizeMinModifier() = width(IntrinsicSize.Min)
fun Modifier.widthTextWidthModifier() = width(textWidth.value.dp)
if (textWidth.value == 0) {
modifier.then(Modifier.widthIntrinsicSizeMinModifier())
} else {
modifier.then(Modifier.widthTextWidthModifier())
}
BasicTextField(
value = value,
modifier = modifier
.then(
if (decoratedLabel != null) {
Modifier.padding(top = OutlinedTextFieldTopPadding)
} else {
Modifier
}
)
.onSizeChanged {
textWidth.value = it.width
}, ...
通过这些更改,我们不再有默认的宽度,但仍然有一些间距从右边离开
更新(2022年2月15日)
不要从@Compose库复制文件。一些API调用不起作用。在我的例子中,textColor和背景设置对我的自定义OutlinedFormTextField不起作用,而对OutlinedTextField来说,一切都很好:
colors = TextFieldDefaults.outlinedTextFieldColors(
textColor = Color.Red,
backgroundColor = backgroundColor.value
...
我还发现,您可以用Row组件 Package OutlinedTextField并在其中设置以下内容,而不是覆盖与OutlinedTextField相关的文件:
Modifier.defaultMinSize(minWidth = 1.dp)
它将删除默认情况下Compose建议的巨大minWidth,但标签后的额外间距仍然存在。
有人知道怎么把它取下来吗?
2条答案
按热度按时间j8ag8udp1#
以下是我的临时解决方案,它使用可调整的OutlinedTextField组件。它还修复了背景更改时左上角的OutlinedTextField交叉标签:
deyfvvtc2#
要强制
BasicTextField
扭曲其宽度,而不是使用默认的minWidth = 280 dp,请使用以下修改器:什么不起作用:设置
Modifier.widthIn(min = 1.dp)
.