【问题标题】:Dismissing Keyboard on Checkbox onCheckedChange Jetpack Compose关闭复选框 onCheckedChange Jetpack Compose 上的键盘
【发布时间】:2021-06-02 05:44:24
【问题描述】:

我正在使用 Jetpack compose,并且在选中该框时尝试关闭键盘(TextField 在获得焦点时创建)。

我有类似的东西:

val focusManager = LocalFocusManager.current

    Checkbox(
        checked = isChecked,
        onCheckedChange = { isChecked ->
            focusManager.clearFocus()
    })

但是,我发现当我设置断点时,无论何时选中/取消选中该框,focusManager.clearFocus() 都不会被一致地调用。

有没有一种简单的方法可以在选中一个框时关闭键盘?为什么一直没有调用 onCheckedChange?

【问题讨论】:

    标签: android android-edittext android-jetpack-compose android-checkbox


    【解决方案1】:

    我认为您与 isChecked 变量不匹配。这就是不触发onCheckedChange 的原因。检查以下可组合函数。

    我添加了一个 TextField。如果单击它,它将获得焦点并打开键盘。在复选框中,我给出的逻辑是,如果复选框被选中,如果它已经打开,它将关闭键盘。

    @Composable
    fun checkCheckbox() {
        val textFieldValue = remember { mutableStateOf("") }
        val isChecked = remember { mutableStateOf(false) }
    
        OutlinedTextField(
            modifier = Modifier
                .fillMaxWidth(),
            value = textFieldValue.value,
            onValueChange = { textFieldValue.value = it },
            label = { Text("Label") }
        )
    
        val focusManager = LocalFocusManager.current
    
        Checkbox(
            checked = isChecked.value,
            onCheckedChange = { checked ->
                Log.e("Check::", checked.toString())
                isChecked.value = checked
    
                if (checked) {
                    Log.e("Focus::", "Clear")
                    focusManager.clearFocus()
                }
            })
    }
    

    【讨论】:

      【解决方案2】:

      onCheckedChange 是在单击复选框时调用的回调。

      如果您想在不清除焦点的情况下关闭键盘,您可以使用keyboardController?.hide()

      var isChecked by remember { mutableStateOf(false) }
      val keyboardController = LocalSoftwareKeyboardController.current
      
      Checkbox(
          checked = isChecked,
          onCheckedChange = { 
              isChecked = it
              keyboardController?.hide()
      
              //If you want to close the keyboard only if the checkbox is checked
              //if (it) { 
              //    keyboardController?.hide()
              //}
          })
      

      如果您想关闭键盘并清除焦点,请使用:

      Checkbox(
          checked = isChecked,
          onCheckedChange = { 
              isChecked = it
              focusManager.clearFocus()
          })
      

      【讨论】:

      • 我在想onCheckedChange 是如何在您单击复选框时回调的。所以它不依赖于checked 及其价值,对吗? onCheckedChange 应该会在您单击复选框时触发。
      • @SmallGrammer 是的,它不依赖于值,它只是在值变化时触发。
      猜你喜欢
      • 2020-03-26
      • 2022-11-21
      • 2022-10-25
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 2021-04-19
      • 1970-01-01
      相关资源
      最近更新 更多