如何在我的TextField失去焦点后确定焦点的位置(Android Jetpack Compose)



当我的TextField失去焦点时,我如何确定焦点在哪里?

var input1 by remember { mutableStateOf("") }
var input2 by remember { mutableStateOf("") }
Column{
TextField(
value = input1,
onValueChange = {input1=it},
Modifier.width(150.dp).onFocusChanged { state ->
if (state == FocusState.Inactive){
// Here I know that Input1 lost focus but how can I determine for sure the focus went to other then Input2 UI element?
if (focusWentNotToInput2){
// Do semething
}
}
}
)
TextField(
value = input2,
onValueChange = {input2=it},
Modifier.width(150.dp)
)
}

我找到了一个解决方案,但不是100%喜欢它。至少它有效。我正在设置一个标志,如果input2被聚焦,那么如果input1失去聚焦,我等待50ms,如果isInput2Focused标志没有被触发,那么其他一些ui元素被聚焦

var isInput2Focused by remember { mutableStateOf(false)}
var input1 by remember { mutableStateOf("") }
var input2 by remember { mutableStateOf("") }
val coroutineScope = rememberCoroutineScope()
Column{
TextField(
value = input1,
onValueChange = {input1=it},
Modifier.width(150.dp).onFocusChanged { state ->
if (state.isFocused) isInput2Focused = false
else{
coroutineScope.launch {
delay(50)
if (!isInput2Focused){
// Do semething
}
}
}
}
)
TextField(
value = input2,
onValueChange = {input2=it},
Modifier.width(150.dp).onFocusChanged { state ->
if (state.isFocused) isInput2Focused = true
}
)
}

我已经妥善解决了这个问题。虽然它很管用,但看起来并不是很好看。我只是用了两个变量来确定textfiel何时失去焦点

//two types of validattion is there
val isPasswordError = validationErrors.isNotEmpty() && password.isNotEmpty()
//weather is focus or not
var passwordDoneClick by remember { mutableStateOf(false) }
// wather focus gone
var ispasswordFocusedGone by remember { mutableStateOf(false) }
.onFocusChanged {
if (it.isFocused){
passwordDoneClick = true
ispasswordFocusedGone = false
}

if (passwordDoneClick && !it.isFocused){
ispasswordFocusedGone =true
}
}
//error to show in ui
if (isPasswordError && ispasswordFocusedGone ) {
Text(
text = "Password is invalid",
style = MaterialTheme.typography.bodyMedium,
color = Color.Red
)
Spacer(modifier = modifier.height(8.dp))
} else {
Spacer(modifier = modifier.height(8.dp))
}

最新更新