onLongClick 触发 Linkify onClick

onLongClick triggers Linkify onClick

我正在聊天,我正在使用 Linkify 解析 links 并使用 onLongClick 打开一个允许用户复制消息内容的对话框。

chatText 是我的 TextView。

chatText.setText(message);
Linkify.addLinks(chatText, Linkify.ALL);
chatText.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
        final CharSequence[] items = {
                    "Copy"
            };

            AlertDialog.Builder builder = new AlertDialog.Builder(activity);
            builder.setTitle("Select Action");
            builder.setItems(items, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item) {
                copyToClipboard();
                }
            });
            AlertDialog alert = builder.create();
            alert.show();
            return true;   
     }
    });

对于普通消息,它工作正常,问题是当我长按 link 化消息时,它会打开对话框,然后立即跟随 link。 (例如打开浏览器) 当我回到应用程序时,表单仍然存在,并且复制到剪贴板工作正常。

return true;

如果我没记错的话,应该会阻止 onClick。 我不知道如何在我长按时阻止 onClick。

如果有人遇到同样的问题,我发现这是 Android 的一个已知问题。 必用

    android:descendantFocusability="blocksDescendants"

为了避免linkifyed textview阻塞其他事件

这里报告了问题

https://code.google.com/p/android/issues/detail?id=3414

这是我为这个案例写的 class:

public class NoLongClickMovementMethod extends LinkMovementMethod {

long longClickDelay = ViewConfiguration.getLongPressTimeout();
long startTime;

private static NoLongClickMovementMethod linkMovementMethod = new NoLongClickMovementMethod();

@Override
public boolean onTouchEvent(android.widget.TextView widget, android.text.Spannable buffer, MotionEvent event) {
    int action = event.getAction();

    if (action == MotionEvent.ACTION_DOWN) {
        startTime = System.currentTimeMillis();
    }

    if (action == MotionEvent.ACTION_UP) {
        long currentTime = System.currentTimeMillis();
        if (currentTime - startTime >= longClickDelay)
            return true;
    }
    return super.onTouchEvent(widget, buffer, event);
}

public static android.text.method.MovementMethod getInstance() {
    return linkMovementMethod;
}

用法:textView.setMovementMethod(NoLongClickMovementMethod.getInstance());