Как предотвратить жест щелчка на экране, когда отображается всплывающее окно?

Когда TooltipBox открыт, щелчок по любому составному элементу на экране не имеет никакого эффекта, кроме закрытия всплывающего окна. Как он это делает и какой эффективный способ реализовать это независимо от того, где находится текущий Composable в дереве композиции, когда Popup открыт, поэтому никакой другой Composable из Popup не получает никаких жестов.

@Preview
@Composable
fun TooltipBoxSample() {
    Column(
        modifier = Modifier.fillMaxSize().border(2.dp, Color.Blue)
    ) {
        Button(
            onClick = {}
        ){
            Text("Some button")
        }

        val state = rememberTooltipState(
            isPersistent = true
        )
        val coroutineScope = rememberCoroutineScope()

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

        Row(
            modifier = Modifier.weight(1f)
        ) {
            Spacer(modifier = Modifier.width(100.dp))

            TooltipBox(
                positionProvider = rememberPlainTooltipPositionProvider(
                    spacingBetweenTooltipAndAnchor = 16.dp
                ),
                state = state,
                tooltip = {

                    PlainTooltip(
                        caretProperties = CaretProperties(
                            caretWidth = 16.dp,
                            caretHeight = 16.dp
                        ),
                        shape = RoundedCornerShape(16.dp),
                        containerColor = Color.Red
                    ) {
                        Text(
                            text = "Tooltip Content for testing...",
                            modifier = Modifier.padding(16.dp)
                        )
                    }

                },
                content = {
                    Icon(
                        modifier = Modifier
                            .size(60.dp)
                            .clickable {
                                coroutineScope.launch {
                                    state.show()
                                }
                            },
                        imageVector = Icons.Default.Info,
                        contentDescription = null
                    )
                }
            )
        }

    }
}

Если вы коснетесь любого места экрана с помощью Popup Composables, вы получите события щелчка.

@Preview
@Composable
fun PopupOpenCloseTest() {

    var showPopup by remember {
        mutableStateOf(false)
    }


    Column(
        modifier = Modifier.fillMaxSize()
    ) {

        Button(
            onClick = {}
        ) {
            Text("Some button")
        }

        Box {
            Icon(
                modifier = Modifier
                    .border(2.dp, Color.Blue)
                    .size(60.dp)
                    .clickable {
                        if (showPopup.not()) {
                            showPopup = true
                        }
                        println("CLICKED showPopup: $showPopup")
                    },
                imageVector = Icons.Default.Info,
                contentDescription = null
            )

            if (showPopup) {
                Popup(
                    offset = IntOffset(300, 300),
                    onDismissRequest = {
                        if (showPopup) {
                            showPopup = false
                        }
                    }
                ) {
                    Box(
                        modifier = Modifier.background(Color.White).padding(16.dp)
                    ) {
                        Text("Popup Content")
                    }
                }
            }
        }

    }
}

Я проверил исходный код Tooltip и BasicTooltip, но нет места, где оно создает окно или представление, которое отменяет жест или использует его.

1
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сделать всплывающее окно фокусируемым поможет:

Popup(
  properties = PopupProperties(focusable = true),
  ...
)

Хороший улов. Я понял это через час после того, как задал вопрос, но подумал, что более уместно будет ответить кто-то другой, я собирался ответить, если кто-нибудь не ответит в течение 24 часов. TooltipBox не делает ничего, кроме установки фокусируемого значения true.

Thracian 15.07.2024 14:30

Другие вопросы по теме