问题描述
请参阅下面的屏幕录制。如果您选择一些文本,则会出现上下文菜单(复制/共享/全选)。如果您开始拖动蓝色拖动手柄,上下文菜单会消失,一旦您松开手柄,菜单就会再次出现。因此,基本上,菜单仅在选择完成时出现,而不是在您仍在选择文本时出现。
我想在选择完成后得到通知(即,在菜单出现的同时)。我认为 onPrepareActionMode
会在选择完成并出现菜单时被调用,但是在使用下面的代码进行测试后,似乎在我拖动手柄时会持续调用 onPrepareActionMode
,即使选择菜单不可见。此外,它经常因为一次拖动而被调用两次。所以 onPrepareActionMode
似乎不是当时的答案。那是什么?
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 来过滤掉它。我将使用此解决方法,直到有人更了解更优雅和正确的解决方案.