用于文本选择的浮动工具栏 Jetpack Compose

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 源代码:AndroidTextToolbarTextActionModeCallback

然后你可以像这样使用它:

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中修复