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
我想在文本选择上做一些事情,它是 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