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

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

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

【问题讨论】:

    标签: android kotlin android-jetpack android-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")
        }
    }
    

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

    那么你可以这样使用它:

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

    要使整个应用程序都可以使用,您需要在可组合树的顶部执行此操作,例如在setContent 中。

    附言我必须定义ActionCallback,因为它在compose 内部。我相信这是一个错误,所以我创建了this issue

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 2021-07-17
      • 1970-01-01
      • 2021-11-11
      • 2021-08-27
      • 1970-01-01
      • 2012-11-23
      • 2020-05-10
      • 1970-01-01
      相关资源
      最近更新 更多