如何在 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
我正在尝试找到一个简单的解决方案来解决如何在 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