本文介绍了用于文本选择Jetpack Compose的浮动工具栏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

推荐答案

您可以在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")
    }
}

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

然后您可以这样使用它:

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

若要使此操作适用于整个应用程序,您需要在Composables树的顶部执行此操作,例如,在setContent中。

附注:我必须定义ActionCallback,因为它在编写时是内部的。我认为这是一个错误,所以我创建了this issue

这篇关于用于文本选择Jetpack Compose的浮动工具栏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-10 03:11