【问题标题】:Android Jetpack Compose AnimatedVisibility innerTextField of BasicTextFieldAndroid Jetpack 编写 BasicTextField 的 AnimatedVisibility innerTextField
【发布时间】:2021-10-07 17:48:49
【问题描述】:

在动画运行后点击以专注于我的 BasicTextField 时,我收到以下错误。请帮忙。

decorationBox = { innerTextField ->
    Box(Modifier.weight(1f)) {
        if (addressText.isEmpty()) {
            Label3(dynamicId = structure?.placeholder)
        }
        AnimatedVisibility(
            visible = focusAddress
        ) {
            innerTextField()
        }
    }
},

E/InputConnectionWrapper: InputConnectionWrapper.waitForInputConnectionFutureInternal():1542 获取输入连接调用结果失败。

java.lang.IllegalStateException: LayoutCoordinate 操作仅在 isAttached 为 true 时有效

编辑: 如果文本字段获得、失去并再次获得焦点,则可以复制它。问题是 coreTextField() 不可用。这是一个产生相同错误消息的简短示例:

@Composable
fun TextInput(
    modifier: Modifier = Modifier,
    value: String,
    label: String,
    onValueChanged: (text: String) -> Unit,
) {
    var textFieldValueState by remember { mutableStateOf(TextFieldValue(text = value)) }
    val textFieldValue = textFieldValueState.copy(text = value)

    val interactionSource = remember { MutableInteractionSource() }
    val isFocused = interactionSource.collectIsFocusedAsState().value

    BasicTextField(
        value = textFieldValue,
        modifier = modifier
            .defaultMinSize(
                minWidth = TextFieldDefaults.MinWidth,
                minHeight = TextFieldDefaults.MinHeight,
            ),
        onValueChange = {
            textFieldValueState = it
            if (value != it.text) {
                onValueChanged(it.text)
            }
        },
        interactionSource = interactionSource,
        decorationBox = @Composable { coreTextField ->
            Surface(
                shape = RoundedCornerShape(),
                border = BorderStroke(
                    width = 2.dp,
                    color = Colors.Black,
                )
            ) {
                Column(
                    modifier = Modifier
                        .height(52.dp)
                        .padding(horizontal = 16.dp, vertical = 8.dp),
                    horizontalAlignment = Alignment.Start,
                    verticalArrangement = Arrangement.Center,
                ) {
                    Text(text = label)
                    if (isFocused) coreTextField()
                }
            }
        },
    )
}

【问题讨论】:

标签: android kotlin android-animation textfield android-jetpack-compose


【解决方案1】:

问题在于BasicTextField 可组合包含decorationBox 中定义的组合,因此不能仅使用AnimatedVisibility 或简单的if(在您的示例中为if (isFocused) coreTextField())将其从组合中删除。我们需要一些有点像旧的View.GONE 的东西——可组合项应该占用零空间,但应该仍然存在。等效的是使用layout 修饰符,而不是放置placeable

我根据从 1f 到 0f 的 labelProgress 变量为这些字段设置动画,因此我正在像这样更改 placeable 的高度。

        Box(modifier = Modifier
            .alpha(labelProgress)
            .layout { measurable, constraints ->
                val placeable = measurable.measure(constraints)
                layout(placeable.width, (placeable.height * labelProgress).toInt()) {
                    placeable.placeRelative(0, 0, 0f)
                }

            }
        ) {
            innerTextField()
        }

基本的可见/隐藏版本可能如下所示:

        Box(modifier = Modifier
            .layout { measurable, constraints ->
                if(showInnerTextField){
                    layout(placeable.width, (placeable.height * labelProgress).toInt()) {
                        placeable.placeRelative(0, 0, 0f)
                    }
                }

            }
        ) {
            innerTextField()
        }

【讨论】:

  • 顺便说一句,而不是消息“仅当 isAttached 为 true 时才允许 LayoutCoordinate 操作”,他们应该只使用这个 GIF:tenor.com/view/… ;)
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2021-08-22
  • 2021-07-12
  • 1970-01-01
相关资源
最近更新 更多