我有一个自定义弹出窗口:

        if (expanded) {
            Popup(
                onDismissRequest = {},
                properties = PopupProperties(
                    clippingEnabled = false
                ),
                popupPositionProvider = object : PopupPositionProvider {
                    override fun calculatePosition(
                        anchorBounds: IntRect,
                        windowSize: IntSize,
                        layoutDirection: LayoutDirection,
                        popupContentSize: IntSize
                    ): IntOffset {
                        return IntOffset(
                            x = textXPosition,
                            y = barYPosition
                        )
                    }
                }
            ) {
                Text(
                    text = "This is the popup content.",
                    modifier = Modifier.background(Color.White)
                )
            }
        }

式中,textXPositionbarYPosition的取值如下:


textXPosition:

        var textXPosition by remember { mutableStateOf(0) }

        Text(
            text = state.currentFileName,
            modifier = Modifier
                .weight(1f)
                .padding(start = 8.dp)
                .clickable { expanded = !expanded }
                .onGloballyPositioned { coordinates ->
                    textXPosition = coordinates.positionInRoot().x.toInt()
                }
        )

        if (expanded) {...}

barYPosition:

    var barYPosition by remember {
        mutableStateOf(0)
    }

    ActionBar(
        modifier = Modifier
            .height(36.dp)
            .background(Color(0xfffafafa))
            .onGloballyPositioned { coordinates ->
                barYPosition = coordinates.positionInRoot().y.toInt()
            }
    ...)


我最后得到的是图片上的:

enter image description here

这个 idea 是弹出窗口将直接在文本上方,但实际上有一个小缺口,我不知道为什么..

推荐答案

如果您锚定弹出窗口和您的内容在一个框内,并设置偏移量的高度弹出窗口,它应该会像预期的那样工作.

@Preview
@Composable
private fun Test() {

    var barYPosition by remember {
        mutableStateOf(0)
    }

    Column(
        modifier = Modifier.fillMaxSize().background(Color.Black)
    ) {

        TopAppBar(
            modifier = Modifier
                .height(36.dp)
                .background(Color(0xfffafafa))
        ) {

        }
        Spacer(modifier = Modifier.weight(1f))


        Box(
            modifier = Modifier.border(2.dp, Color.Red)
        ) {

            Popup(
                onDismissRequest = {},
                offset = IntOffset(0, y = -barYPosition),
                properties = PopupProperties(
                    clippingEnabled = false
                )
            ) {
                Text(
                    text = "This is the popup content.",
                    modifier = Modifier.background(Color.White)
                        .onPlaced {
                            barYPosition = it.size.height
                        }
                )
            }
            Row(
                modifier = Modifier.fillMaxWidth().background(Color.White),
                verticalAlignment = Alignment.CenterVertically
            ) {
                Text(
                    "Some Text Needed",
                    fontSize = 24.sp
                )
                Spacer(modifier = Modifier.weight(1f))

                Icon(imageVector = Icons.Default.Settings, contentDescription = null)
            }
        }
    }
}

Android相关问答推荐

无法理解Kotlin Coroutines and Flows中的J.C.编程行为

Android:MethodHandle. invoke和MethodHandle. invokeExact仅从Android O( - min—api 26)开始支持

如何将结果从viewModelScope传递到活动

推断的类型是片段,但应为上下文

Android和Rust,OpenSSL交叉编译在ARM V7上链接失败

Android Studio -未显示布局预览(不推荐使用安全管理器)

如何在Android Studio中将我的Java-库&库设置为Kotlin库

在 kotlin 上向适配器添加绑定视图功能

Andorid Studio编译器如何自动为变量editText生成mutableStateOf("")的方法名?

当 EditText 用于在 android studio 中将字符串发送到 firebase 时,仅允许安全调用错误

DatePickerDialog (Android/Kotlin) 的两个问题

如何将一个没有 GRADLE 的古老 Android 项目导入到今天的 Android Studio 中?

如何在 Jetpack Compose 中设置卡片高度

在 theme.xml 中使用 android:autoCompleteTextViewStyle

Compose Accompaniist Pager 中的 TabRow/Tab 重组问题

无法解析依赖项'com.github.smarteist:autoimageslider:1.4.0-appcompat'

如何使用 ConstraintLayout 链接两个文本

如何获取 Material Design 3 的底部导航栏高度?

等到上一个事件完成 Rx

在 Android Studio 中保存数据