Anonymous
Android Compose, EsposedDropdownmenu не позиционирует должным образом при изменении позиции якоря
Сообщение
Anonymous » 12 мар 2025, 15:14
Я использую exposedDropdownmenubox в Android, чтобы отобразить параметры раскрытия. Мой макет включает в себя поле ввода, и когда пользователь пытается ввести данные, появляется клавиатура. Однако, когда пользователь пытается выбрать раскрывающуюся опцию, клавиатура увольняется, что приводит к переходу фокуса к раскрывающемуся спине. Проблема возникает при увольнении клавиатуры: позиция якоря сдвигается, но раскрывающийся список остается в исходном положении, что приводит к плохому пользовательскому опыту. < /P>
Код: Выделить всё
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DropdownMenu(
label: String,
options: List,
resolveOption: (t: T) -> String,
selectedOption: T,
onOptionSelected: (t: T) -> Unit
) {
var expanded by remember { mutableStateOf(false) }
val focusRequester = remember { FocusRequester() }
ExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = it }) {
OutlinedTextField(
value = resolveOption(selectedOption),
onValueChange = { },
label = { Text(label) },
readOnly = true,
trailingIcon = {
ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded)
},
modifier = Modifier
.menuAnchor()
.fillMaxWidth()
.clickable {
Log.d("Testing", "Dropdown clicked")
expanded = !expanded
}
.focusRequester(focusRequester)
)
ExposedDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
options.forEach { option ->
DropdownMenuItem(text = {
Text(text = resolveOption(option))
}, onClick = {
onOptionSelected(option)
expanded = false
})
}
}
}
}
@Composable
fun test() {
val debitOptions = listOf("Credit card", "Debit card", "Net Banking", "PhonePe", "Cash")
DropdownMenu(
label = "XXX",
options = debitOptions,
resolveOption = { it },
selectedOption = "",
onOptionSelected = { }
)
val bank = listOf("Kotak", "HDFC", "SBI", "ICICI", "Cash")
DropdownMenu(
label = "XXX",
options = bank,
resolveOption = { it },
selectedOption = "",
onOptionSelected = { }
)
DropdownMenu(
label = "XXX",
options = debitOptions,
resolveOption = { it },
selectedOption = "",
onOptionSelected = { }
)
DropdownMenu(
label = "XXX",
options = bank,
resolveOption = { it },
selectedOption = "",
onOptionSelected = { }
)
DropdownMenu(
label = "XXX",
options = debitOptions,
resolveOption = { it },
selectedOption = "",
onOptionSelected = { }
)
DropdownMenu(
label = "XXX",
options = bank,
resolveOption = { it },
selectedOption = "",
onOptionSelected = { }
)
OutlinedTextField(
value = "",
onValueChange = {},
label = { Text(text = "Amount") },
keyboardOptions = KeyboardOptions.Default.copy(
keyboardType = KeyboardType.Decimal // Allow decimal input
)
)
}
проблема
Подробнее здесь:
https://stackoverflow.com/questions/795 ... the-anchor
1741781685
Anonymous
Я использую exposedDropdownmenubox в Android, чтобы отобразить параметры раскрытия. Мой макет включает в себя поле ввода, и когда пользователь пытается ввести данные, появляется клавиатура. Однако, когда пользователь пытается выбрать раскрывающуюся опцию, клавиатура увольняется, что приводит к переходу фокуса к раскрывающемуся спине. Проблема возникает при увольнении клавиатуры: позиция якоря сдвигается, но раскрывающийся список остается в исходном положении, что приводит к плохому пользовательскому опыту. < /P> [code] @OptIn(ExperimentalMaterial3Api::class) @Composable fun DropdownMenu( label: String, options: List, resolveOption: (t: T) -> String, selectedOption: T, onOptionSelected: (t: T) -> Unit ) { var expanded by remember { mutableStateOf(false) } val focusRequester = remember { FocusRequester() } ExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = it }) { OutlinedTextField( value = resolveOption(selectedOption), onValueChange = { }, label = { Text(label) }, readOnly = true, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, modifier = Modifier .menuAnchor() .fillMaxWidth() .clickable { Log.d("Testing", "Dropdown clicked") expanded = !expanded } .focusRequester(focusRequester) ) ExposedDropdownMenu( expanded = expanded, onDismissRequest = { expanded = false } ) { options.forEach { option -> DropdownMenuItem(text = { Text(text = resolveOption(option)) }, onClick = { onOptionSelected(option) expanded = false }) } } } } @Composable fun test() { val debitOptions = listOf("Credit card", "Debit card", "Net Banking", "PhonePe", "Cash") DropdownMenu( label = "XXX", options = debitOptions, resolveOption = { it }, selectedOption = "", onOptionSelected = { } ) val bank = listOf("Kotak", "HDFC", "SBI", "ICICI", "Cash") DropdownMenu( label = "XXX", options = bank, resolveOption = { it }, selectedOption = "", onOptionSelected = { } ) DropdownMenu( label = "XXX", options = debitOptions, resolveOption = { it }, selectedOption = "", onOptionSelected = { } ) DropdownMenu( label = "XXX", options = bank, resolveOption = { it }, selectedOption = "", onOptionSelected = { } ) DropdownMenu( label = "XXX", options = debitOptions, resolveOption = { it }, selectedOption = "", onOptionSelected = { } ) DropdownMenu( label = "XXX", options = bank, resolveOption = { it }, selectedOption = "", onOptionSelected = { } ) OutlinedTextField( value = "", onValueChange = {}, label = { Text(text = "Amount") }, keyboardOptions = KeyboardOptions.Default.copy( keyboardType = KeyboardType.Decimal // Allow decimal input ) ) } [/code] проблема Подробнее здесь: [url]https://stackoverflow.com/questions/79503564/android-compose-exposeddropdownmenu-is-not-positioning-properly-when-the-anchor[/url]