Vad*_*huk 9 android kotlin android-jetpack android-jetpack-compose
如何在 Jetpack Compose 中将选定文本的菜单自定义到 TextField?我的意思是这样的:
在官方文档或互联网上没有找到任何有关如何使用 Jetpack Compose 执行此操作的信息。
Phi*_*hov 10
TextToolbar
您可以在 中提供自定义LocalTextToolbar
。在那里,在该showMenu
方法中,您必须startActionMode
像在旧 Android 中所做的那样。
CustomTextToolbar
:
override fun showMenu(
rect: Rect,
onCopyRequested: (() -> Unit)?,
onPasteRequested: (() -> Unit)?,
onCutRequested: (() -> Unit)?,
onSelectAllRequested: (() -> Unit)?
// Before 1.2.0 ActionCallback has to be defined like this:
// typealias ActionCallback = () -> Unit
//
// 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")
}
}
Run Code Online (Sandbox Code Playgroud)
作为如何实现它的参考,请查看 compose 源代码:AndroidTextToolbar和TextActionModeCallback
然后你可以像这样使用它:
CompositionLocalProvider(
LocalTextToolbar provides CustomTextToolbar(LocalView.current)
) {
var text by remember { mutableStateOf("") }
TextField(value = text, onValueChange = { text = it })
}
Run Code Online (Sandbox Code Playgroud)
要使此操作适用于整个应用程序,您需要在可组合项树的顶部执行此操作,例如在setContent
.
ps 我必须定义ActionCallback
,因为它是 compose 内部的。我相信这是一个错误,所以我创建了这个问题。它已在 Compose 1.2.0-alpha05中修复。
归档时间: |
|
查看次数: |
3968 次 |
最近记录: |