【问题标题】:Jetpack Compose - Capture Key Event In Text FieldJetpack Compose - 在文本字段中捕获关键事件
【发布时间】:2021-08-20 11:55:13
【问题描述】:

我想在待办事项列表中创建一个文本字段,其中 when the user presses backspace on an empty text field , it removes itself 来自列表,如您所见,操作非常简单!

Jetpack Compose ,如果关键事件是可编辑的,Core Text Field 不会将其关键事件传播给父可组合项/修饰符 ~~ 写在他们的代码中

所以我尝试了这个,但它没有按预期工作

Modifier.onKeyEvent {
     Log.d("BL_KeyEvent",it.type.toString())
     if (it.key.keyCode == Key.Backspace.keyCode) {
           if (item.text.isEmpty()) {
              onBackspaceRemove()
           }
       }
       false
     }

我只是想知道如何实现它,因为 CoreTextField 是内部的,我无法在文本字段中捕获关键事件

【问题讨论】:

  • 我需要onBackspaceRemove() 方法

标签: android android-jetpack-compose android-jetpack-compose-list


【解决方案1】:

@Composable
fun StackList(){
    var list = remember { mutableStateListOf<String>() } // This should be in your viewmodel
    LazyColumn{
        items(list){item ->
            var value by remember { mutableStateOf("") }
            TextField(
                modifier = Modifier.onKeyEvent {
                    Log.d("BL_KeyEvent",it.type.toString())
                    if (it.key.keyCode == Key.Backspace.keyCode) {
                        if (value.isEmpty()) {
                            list.remove(item)
                        }
                    }
                    false
                },
                value = value,
                onValueChange = {value = it}
            )
        }
    }
}

【讨论】:

  • 正如我已经说过的那样,当我按下退格键时不会触发该事件,并且我使用的是您编写的相同代码,因为核心文本字段使用 onKeyEvent 并在可编辑时返回 true 所以它不会在可组合的层次结构中传播
【解决方案2】:

如果自您上次尝试 @Waqas Tahir 以来此问题已得到解决,但我使用的是 ComposeUI v1.0.2,以下对我有用:

@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun aTextFieldWithOnBackspacePressedAction() {
    // this should be hoisted to ViewModel
    var text by remember { mutableStateOf("") }

    BasicTextField(
        value = text,
        // this also should be hoisted to ViewModel
        onValueChange = { text = it },
        modifier = Modifier
            .onKeyEvent { event: KeyEvent ->
                // handle backspace key
                if (event.type == KeyEventType.KeyUp &&
                    event.key == Key.Backspace &&
                    text.isEmpty()
                // also any additional checks of the "list" i.e isNotEmpty()
                ) {
                    // TODO remove from list
                    return@onKeyEvent true
                }
                false
            }
    )
}

【讨论】:

    【解决方案3】:

    只需将 false 更改为 true。它应该可以工作。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 2022-06-27
    • 1970-01-01
    • 2021-11-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    相关资源
    最近更新 更多