6

我有一个带有 html 字符串的文本视图,其中包含锚点。当我单击文本视图时,我想调用一个名为 A 的方法,当我单击文本视图中的一个链接时,我想调用一个名为 B 的方法。我得到了这个工作但我遇到了一个问题:当我单击一个链接时,方法B 被调用,但方法 A 也被调用。当我单击链接时,如何确保只调用方法 B,而不是 B 和 A?

我的代码:

for (int i = 0; i < ingevoegd.length(); i++) {
        JSONObject soortingevoegd = ingevoegd.getJSONObject(i);
        String type = soortingevoegd.getString("type");         
        if (type.equals("Vis")) {
            String link = "<a href = 'com.aquariumzoeken.pro://Soortweergave?selected="
                    + naam + "&type=Vis" + "'>" + naam + "</a>";
            text = text.replaceAll(naam, link);
        }
    }

    TextView texttv = (TextView) v.findViewById(R.id.textviewer);   


    texttv.setText(Html.fromHtml(text));
    texttv.setMovementMethod(LinkMovementMethod.getInstance());

和文本视图 onclicklistener:

texttv.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            try {

                switchToEditMode sw = new switchToEditMode();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });

在此先感谢,西蒙

4

4 回答 4

10

我为你做黑客,试试这个代码!

解释:

1.使用自定义的ClickableSpan来处理url的点击。

2.clickablespan会在textview之前处理click事件,当一个链接被点击时做一个flag。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView textView = (TextView) findViewById(R.id.main_text);
    textView.setMovementMethod(LinkMovementMethod.getInstance());

    CharSequence charSequence = textView.getText();
    SpannableStringBuilder sp = new SpannableStringBuilder(charSequence);

    URLSpan[] spans = sp.getSpans(0, charSequence.length(), URLSpan.class);

    for (URLSpan urlSpan : spans) {
        MySpan mySpan = new MySpan(urlSpan.getURL());
        sp.setSpan(mySpan, sp.getSpanStart(urlSpan),
                sp.getSpanEnd(urlSpan), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
    }

    textView.setText(sp);

    textView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // 2.if clicking a link
            if (!isClickingLink) {
                Log.w("log", "not clicking link");
            }
            isClickingLink = false;
        }
    });
}


private boolean isClickingLink = false;

private class MySpan extends ClickableSpan {

    private String mUrl;

    public MySpan(String url) {

        super();
        mUrl = url;
    }

    @Override
    public void onClick(View widget) {

        isClickingLink = true;
        // 1. do url click
    }

}
于 2013-07-20T17:46:02.087 回答
6

您可以尝试像这里提到的那样修改 onClickListener:Control onclicklistener in autolink enabled textview

texttv.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                             if(texttv.getSelectionStart()==-1&&texttv.getSelectionEnd()==-1){ 

                       // Method B

                             }

                    }
                });

基本上检查链接开始和结束的位置和时间,只有当你没有通过超链接时,然后调用你的方法 B ,否则它无论如何都会在链接上触发 A 但这只是我猜的一种解决方法

这里的文档:http: //developer.android.com/reference/android/text/Selection.html#getSelectionEnd(java.lang.CharSequence)

于 2013-07-20T16:18:23.720 回答
0

在研究了源代码后,我得出的结论是,没有什么好的方法可以做到这一点,但您最好的选择可能是自定义移动方法。像这样的东西:

class MyMovementMethod extends LinkMovementMethod { 

    // Most of this code copied from LinkMovementMethod
    @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);

            ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);

            if (link.length != 0) {
                if (action == MotionEvent.ACTION_UP) {
                    link[0].onClick(widget);
                } else if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(buffer,
                                       buffer.getSpanStart(link[0]),
                                       buffer.getSpanEnd(link[0]));
                }
                return true;
            } else {
                Selection.removeSelection(buffer);
                // NEW CODE - call method B
                B();
            }
        }

        return Touch.onTouchEvent(widget, buffer, event);
    }

}

然后代替调用LinkMovementMethod.getInstance(),创建一个MyMovementMethod

于 2013-07-20T16:50:07.767 回答
0

在 ClickableSpan 中编写此代码

 ClicableSpan.onClick(View v){
     yourTextView.setOnClickListener(null);
     /*  do your own click
     */
     yourTextView.setOnClickListener(your listener);
 } 
于 2017-10-16T07:04:24.420 回答