【发布时间】:2021-10-27 14:14:07
【问题描述】:
如何为 Jetpack Compose 中的 TextField 自定义所选文本的菜单?我的意思是这样的:
在官方文档或 Internet 上没有找到有关如何使用 Jetpack Compose 执行此操作的任何内容。
【问题讨论】:
标签: android kotlin android-jetpack android-jetpack-compose
如何为 Jetpack Compose 中的 TextField 自定义所选文本的菜单?我的意思是这样的:
在官方文档或 Internet 上没有找到有关如何使用 Jetpack Compose 执行此操作的任何内容。
【问题讨论】:
标签: android kotlin android-jetpack android-jetpack-compose
您可以在LocalTextToolbar 中提供自定义TextToolbar。在那里,在showMenu 方法中,您必须像在旧Android 中那样使用startActionMode。
CustomTextToolbar:
typealias ActionCallback = () -> Unit
class CustomTextToolbar(private val view: View) : TextToolbar {
override fun hide() {
println("hide")
}
override val status: TextToolbarStatus = TextToolbarStatus.Hidden
override fun showMenu(
rect: Rect,
onCopyRequested: ActionCallback?,
onPasteRequested: ActionCallback?,
onCutRequested: ActionCallback?,
onSelectAllRequested: ActionCallback?
) {
println("showMenu")
view.startActionMode(TextActionModeCallback())
}
}
class TextActionModeCallback(
) : ActionMode.Callback {
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
println("onActionItemClicked $mode $item")
return true
}
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
println("onActionItemClicked $mode $menu")
return false
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
println("onActionItemClicked $mode $menu")
return true
}
override fun onDestroyActionMode(mode: ActionMode?) {
println("onActionItemClicked $mode")
}
}
作为参考如何实现它,请查看撰写源代码:AndroidTextToolbar 和 TextActionModeCallback
那么你可以这样使用它:
CompositionLocalProvider(
LocalTextToolbar provides CustomTextToolbar(LocalView.current)
) {
var text by remember { mutableStateOf("") }
TextField(value = text, onValueChange = { text = it })
}
要使整个应用程序都可以使用,您需要在可组合树的顶部执行此操作,例如在setContent 中。
附言我必须定义ActionCallback,因为它在compose 内部。我相信这是一个错误,所以我创建了this issue
【讨论】: