Когда 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, но нет места, где оно создает окно или представление, которое отменяет жест или использует его.
Сделать всплывающее окно фокусируемым поможет:
Popup(
properties = PopupProperties(focusable = true),
...
)
Хороший улов. Я понял это через час после того, как задал вопрос, но подумал, что более уместно будет ответить кто-то другой, я собирался ответить, если кто-нибудь не ответит в течение 24 часов. TooltipBox не делает ничего, кроме установки фокусируемого значения true.