如何在 TextField Jetpack Compose 中禁用 copy/paste/cut?

How to disable copy/paste/cut in a TextField Jetpack Compose?

我正在尝试找到一个简单的解决方案来解决如何在 TextField 中禁用 copy/paste/cut。我确实遇到了几个问题,但没有答案。

创建一个空的工具栏:

object EmptyTextToolbar: TextToolbar {
    override val status: TextToolbarStatus = TextToolbarStatus.Hidden

    override fun hide() {  }

    override fun showMenu(
        rect: Rect,
        onCopyRequested: (() -> Unit)?,
        onPasteRequested: (() -> Unit)?,
        onCutRequested: (() -> Unit)?,
        onSelectAllRequested: (() -> Unit)?,
    ) {
    }
}

然后您可以使用LocalTextToolbar提供它。

在这种情况下,很可能您也不需要文本选择,下面是您也可以禁用它的方法:

var textValue by remember { mutableStateOf(TextFieldValue("")) }
CompositionLocalProvider(
    LocalTextToolbar provides EmptyTextToolbar
) {
    TextField(
        value = textValue,
        onValueChange = { newValue ->
            textValue = if (newValue.selection.length > 0) {
                newValue.copy(selection = textValue.selection)
            } else {
                newValue
            }
        }
    )
}

现在,您可以在 TextField 的顶部添加一个虚拟的透明可组合项,并将其点击侦听器与文本字段的 focusRequestor.

连接起来
val tffr = remember { FocusRequestor() } // TextField Focus-Requestor

Box{

 TextField(
   value = value,
   onValueChange = { value = it }
   modifier = Modifier.focusRequestor(tffr).focusable()
 )

 Surface(
  modifier = Modifier.clickable { tffr.requestFocus() }.alpha(0)
 )

}

这样,当用户尝试点击 TextField 时,点击会被我们的虚拟 Composable 拦截,这会有效地将焦点转移到 TextField。

这意味着他们在技术上将被允许点击 TextField 并输入,但长按不会被该字段注册。

您甚至可以使用 combinedClick 修饰符将 Long-Click-Listener 添加到 Surface,并向用户显示祝酒词,说明 copy/paste 操作已禁用,如果需要的话你需要,就是。

尝试这个答案它禁用剪切,复制到文本字段

etSearchData.customSelectionActionModeCallback = object : ActionMode.Callback {
        override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
            return false
        }

        override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
            return false
        }

        override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
            return false
        }

        override fun onDestroyActionMode(mode: ActionMode?) {
        }

    }

其中 etSearchData 是您的文本字段 ID