如果我长时间点击 uri 跨度,我会收到 FLAG_ACTIVITY_NEW_TASK 错误

if i get a long click uri span, i get FLAG_ACTIVITY_NEW_TASK error

我有一个文本视图,如果文本视图包含 link 并单击此 link,我会收到 FLAG_ACTIVITY_NEW_TASK 错误:

Exception android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

android.app.ContextImpl.startActivity (ContextImpl.java:658)
android.app.ContextImpl.startActivity (ContextImpl.java:645)
android.content.ContextWrapper.startActivity (ContextWrapper.java:331)
android.text.style.URLSpan.onClick (URLSpan.java:75)
com.app.android.util.functions.j.onSingleTapUp ()
android.view.GestureDetector.onTouchEvent (GestureDetector.java:635)
com.app.android.util.functions.j.onTouchEvent ()

我不叫意图。如果我打电话,我会添加直接标志。但只调用 currentSpan.onClick(widget);

public class LongClickMovementMethod extends LinkMovementMethod {

    @SuppressLint("StaticFieldLeak")
    private static LongClickMovementMethod sInstance;

    private final GestureDetector gestureDetector;
    private View widget;
    private LongClickCopySpan currentSpan;

    private LongClickMovementMethod(final Context context) {
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public void onLongPress(MotionEvent e) {
                if (currentSpan != null && widget != null) {
                    currentSpan.onLongClick(widget);
                    widget = null;
                    currentSpan = null;
                }
            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                if (currentSpan != null && widget != null) {
                    currentSpan.onClick(widget);
                    widget = null;
                    currentSpan = null;
                }
                return true;
            }
        });
    }

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

        if (action == MotionEvent.ACTION_UP ||
                action == MotionEvent.ACTION_DOWN) {
            int x = (int) event.getX();
            int y = (int) event.getY();

            x -= widget.getTotalPaddingLeft();
            y -= widget.getTotalPaddingTop();

            x += widget.getScrollX();
            y += widget.getScrollY();

            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);

            LongClickCopySpan longClickCopySpan[] = buffer.getSpans(off, off, LongClickCopySpan.class);
            if (longClickCopySpan.length != 0) {
                LongClickCopySpan aSingleSpan = longClickCopySpan[0];
                if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(buffer, buffer.getSpanStart(aSingleSpan),
                            buffer.getSpanEnd(aSingleSpan));
                    aSingleSpan.setHighlighted(true,
                            ContextCompat.getColor(widget.getContext(), R.color.touch_highlight));
                } else {
                    Selection.removeSelection(buffer);
                    aSingleSpan.setHighlighted(false, Color.TRANSPARENT);
                }

                this.currentSpan = aSingleSpan;
                this.widget = widget;
                return gestureDetector.onTouchEvent(event);
            }
        } else if (action == MotionEvent.ACTION_CANCEL) {
            // Remove Selections.
            LongClickCopySpan[] spans = buffer.getSpans(Selection.getSelectionStart(buffer),
                    Selection.getSelectionEnd(buffer), LongClickCopySpan.class);
            for (LongClickCopySpan aSpan : spans) {
                aSpan.setHighlighted(false, Color.TRANSPARENT);
            }
            Selection.removeSelection(buffer);
            return gestureDetector.onTouchEvent(event);
        }
        return super.onTouchEvent(widget, buffer, event);
    }

    public static LongClickMovementMethod getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new LongClickMovementMethod(context.getApplicationContext());
        }
        return sInstance;
    }
}

如果我调用这个函数,出现上面的崩溃。

textView.setMovementMethod(LongClickMovementMethod.getInstance(getContext()));

我解决了这个问题:

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                if (currentSpan != null && widget != null) {

                    Uri uri = Uri.parse(currentSpan.getURL());
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);

                    widget = null;
                    currentSpan = null;
                }
                return true;
            }