Android 在保留原始监听器的同时添加监听器

Android add listener while preserving original one

我想在文本选择上做一些事情,它是 OnLongClickListener,但在其中我需要获取选定的文本,默认情况下由 OnLongClickListener 处理(至少我认为是这样)。 通过仅添加我的侦听器,实际结果是我的方法被调用,我试图获取选择范围的索引,但这些是 0。我还可以在调试器中看到,那个时刻没有选择文本。

代码:

textView.setTextIsSelectable(true);
textView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            int start = textView.getSelectionStart();
            int end = textView.getSelectionEnd();
            // the rest of code
        }
    }
}

问题:如何保留默认的侦听器,它会先被调用并进行选择,然后再调用我的函数。

我认为您误解了听众的工作方式。它们不会替换标准行为,因此没有默认侦听器可调用以确保发生某些事情。

在这种情况下,很可能您的 OnLongClick 侦听器只是在 TextView 实际更新其选择之前被调用。在这种情况下,您可以尝试让您的侦听器 delay its processing 直到选择设置完成。为此,请考虑使用 Handler.postDelayed()AsyncTask。例如:

textView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            new Handler().post(() -> {/*your code here*/});
        }
    }
}

但是,话虽如此,OnLongClickListener 并不是用于文本选择更改的正确侦听器。您需要一个 ActionMode 回调 来代替:

How to set up a listener on the selected text in TextView