首页 > 解决方案 > 用于文本选择的浮动工具栏 Jetpack Compose

问题描述

如何为 Jetpack Compose 中的 TextField 自定义所选文本的菜单?我的意思是这样的:

例子

在官方文档或 Internet 上没有找到有关如何使用 Jetpack Compose 执行此操作的任何内容。

标签: androidkotlinandroid-jetpackandroid-jetpack-compose

解决方案


您可以TextToolbarLocalTextToolbar. 在那里,在showMenu方法中,您必须startActionMode像在旧 Android 中所做的那样。 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")
    }
}

作为参考如何实现它,请查看编写源代码:AndroidTextToolbarTextActionModeCallback

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

CompositionLocalProvider(
    LocalTextToolbar provides CustomTextToolbar(LocalView.current)
) {
    var text by remember { mutableStateOf("") }
    TextField(value = text, onValueChange = { text = it })
}

要使这项工作适用于整个应用程序,您需要在可组合树的顶部执行此操作,例如在setContent.

ps 我必须定义ActionCallback,因为它是 compose 内部的。我相信这是一个错误,所以我创建了这个问题


推荐阅读