jes*_*nte 8 android android-jetpack-compose android-compose-textfield
可使用代码重现:
var value by remember { mutableStateOf("Hello\nWorld\nInvisible") }
TextField(
value = value,
onValueChange = { value = it },
label = { Text("Enter text") },
modifier = Modifier
.onFocusChanged { Log.d("TAG", "1 OnFocusChangedCalled: $it") }
)
TextField(
value = value,
onValueChange = { value = it },
label = { Text("Enter text") },
modifier = Modifier
.onFocusChanged { Log.d("TAG", "2 OnFocusChangedCalled: $it") }
)
Run Code Online (Sandbox Code Playgroud)
只需打开视图,Logcat 就会显示:
D/TAG: 1 OnFocusChangedCalled: Inactive
D/TAG: 2 OnFocusChangedCalled: Inactive
Run Code Online (Sandbox Code Playgroud)
对于传统的 XML 布局,onFocusChangedListener 仅在用户实际与字段交互时触发。
使用撰写布局,仅当用户从文本字段中删除焦点时,我才尝试进行错误验证。
然而,这种行为导致我的验证在视图初始化后立即触发。
如何使 onFocusChanged 验证仅在用户从字段中删除焦点后发生,而不是在初始化时发生?
onValueChange您可以在属性而不是修饰符中移动验证onFocusChanged。
作为解决方法,您可以在字段获得焦点时存储一个键,然后在失去焦点时检查该值。
就像是:
var focusedTextKey by remember { mutableStateOf("") }
TextField(
value = value,
onValueChange = { value = it },
label = { Text("Enter text") },
modifier = Modifier
.onFocusChanged {
Log.d("TAG", "1 OnFocusChangedCalled: $it")
if (it.isFocused) {
focusedTextKey = "NAME"
} else {
if (focusedTextKey == "NAME") {
//validate the value
}
focusedTextKey = ""
}
}
)
Run Code Online (Sandbox Code Playgroud)