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

Posted

技术标签:

【中文标题】用于文本选择的浮动工具栏 Jetpack Compose【英文标题】:Floating toolbar for text selection Jetpack Compose 【发布时间】:2021-10-27 14:14:07 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

您可以在LocalTextToolbar 中提供自定义TextToolbar。在那里,在showMenu 方法中,您必须像在旧android 中那样使用startActionModeCustomTextToolbar:

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

【讨论】:

以上是关于用于文本选择的浮动工具栏 Jetpack Compose的主要内容,如果未能解决你的问题,请参考以下文章

带有文本选择控件的浮动工具栏

带有浮动顶栏的脚手架(Jetpack Compose)

浮动(float)

Chrome(webkit)中浮动元素中的用户文本选择选择更多文本[关闭]

如何使编辑文本浮动在工具栏和主布局的顶部

Jetpack Composes 01