TextView 选择,选择完成时的事件?

问题描述

如何在 TextView 的选择菜单出现时收到通知

请参阅下面的屏幕录制。如果您选择一些文本,则会出现上下文菜单(复制/共享/全选)。如果您开始拖动蓝色拖动手柄,上下文菜单会消失,一旦您松开手柄,菜单就会再次出现。因此,基本上,菜单仅在选择完成时出现,而不是在您仍在选择文本时出现。

我想在选择完成后得到通知(即,在菜单出现的同时)。我认为 onPrepareActionMode 会在选择完成并出现菜单时被调用,但是在使用下面的代码进行测试后,似乎在我拖动手柄时会持续调用 onPrepareActionMode,即使选择菜单不可见。此外,它经常因为一次拖动而被调用两次。所以 onPrepareActionMode 似乎不是当时的答案。那是什么?

enter image description here

    object: ActionMode.Callback{
        @SuppressLint("ResourceType")
        override fun onCreateActionMode(mode: ActionMode?,menu: Menu?): Boolean
        {
            Log.d("test","onCreateActionMode");
            return true;
        }

        override fun onPrepareActionMode(mode: ActionMode?,"onPrepareActionMode");
            return false
        }

        override fun onActionItemClicked(mode: ActionMode?,item: MenuItem?): Boolean
        {
            Log.d("test","onActionItemClicked");
            return false;
        }

        override fun onDestroyActionMode(mode: ActionMode?)
        {
            Log.d("test","onDestroyActionMode");
        }
    };

解决方法

没有答案?我认为这是在选择文本时自动执行某些操作的常见要求。无论如何,我花了很多时间试图找到一种方法,但都失败了。但是提示来自一个随机的事情:我注意到每当完成文本选择并出现菜单时,

W/androidtc:在主线程上调用 TextClassifier

打印在 Logcat 中。这就是我发现 TextClassifier 中有 TextView 的原因。所以,我尝试了以下代码

    val tc = object:TextClassifier{
        override fun classifyText(request: TextClassification.Request): TextClassification
        {
            Log.d("test","classifyText")
            return super.classifyText(request)
        }
    }

    text2.setTextClassifier(tc);

,正如我怀疑的那样,classifyText 在选择完成时被调用,而不是在我拖动选择手柄期间。这也会在选择关闭时调用(点击其他地方),但我想我可以通过检查所选文本长度是否为 0 来过滤掉它。我将使用此解决方法,直到有人更了解更优雅和正确的解决方案.