android 如何在Jetpack Compose中使小部件不可见?

ilmyapht  于 2023-04-18  发布在  Android
关注(0)|答案(5)|浏览(391)

我试图在一列中显示和隐藏ProgressIndicator。问题是当我想隐藏ProgressIndicator时,其他小部件之间的空间也会被删除(如View.GONE),但我想保持小部件大小(如View.INVISIBLE
例如:

@Composable
fun Main(isLoading: Boolean) {
    Column {
        Text(text = "Text")

        if (isLoading) {
            CircularProgressIndicator()
        }

        Button(onClick = { /*clicked*/ }, content = { Text(text = "Button") })    
    }
}

我找到了一个解决办法,但我不确定这是不是正确的方法。

if (isLoading) {
    CircularProgressIndicator()
} else {
    Spacer(modifier = Modifier.height(40.dp))
}

有没有其他方法可以像View.INVISIBLE一样使widget不可见?
如何获取小部件大小以设置Spacer大小?
谢谢

qlvxas9a

qlvxas9a1#

使用AlphaZero,这在@commonsware的评论中提到,因为你不需要知道空间大小的大小,不像Spacer()composable需要特定的大小,在某些情况下这可能很难知道。

val commentsAlpha = if (condition) 1f else 0f
modifier = Modifier
            .alpha(commentsAlpha)
w41d8nur

w41d8nur2#

我使用以下方法:AnimatedVisibilityhttps:developer.android.com/jetpack/compose/animation#animatedvisibility

// Create a MutableTransitionState<Boolean> for the AnimatedVisibility.
                val state = remember {
                    MutableTransitionState(false).apply {
                        // Start the animation immediately.
                        targetState = true
                    }
                }
                Column {
                    AnimatedVisibility(visibleState = state) {
                        Text(text = "Hello, world!")
                    }

                    // Use the MutableTransitionState to know the current animation state
                    // of the AnimatedVisibility.
                    Text(
                        text = when {
                            state.isIdle && state.currentState -> "Visible"
                            !state.isIdle && state.currentState -> "Disappearing"
                            state.isIdle && !state.currentState -> "Invisible"
                            else -> "Appearing"
                        }
                    )
                }

它还可用于观察动画状态。

rvpgvaaj

rvpgvaaj3#

您的解决方案是正确的,但您也可以将进度指示器 Package 在预期大小的Box中

Box(modifier = Modifier.height(40.dp) {
    if (condition) {
        CircularProgressIndicator()
    }
}
gmxoilav

gmxoilav4#

您可以使用自定义布局修改器,它定义了一个空白区域的组合,你想使不可见。它也防止接收任何触摸事件时不可见。

fun Modifier.visibility(visible: Boolean): Modifier {
    return layout { measurable, constraints ->
        val placeable = measurable.measure(constraints)

        layout(placeable.width, placeable.height) {
            if (visible) {
                // place this item in the original position
                placeable.placeRelative(0, 0) 
            }
        }
    }
}
ssgvzors

ssgvzors5#

用途:

Spacer(modifier = Modifier.height(24.dp))

相关问题