handle textview link click in my android app

前端 未结 12 1091
迷失自我
迷失自我 2020-11-22 04:33

I\'m currently rendering HTML input in a TextView like so:

tv.setText(Html.fromHtml(\"test\"));

The HTML b

12条回答
  •  余生分开走
    2020-11-22 05:09

    This answer extends Jonathan S's excellent solution:

    You can use the following method to extract links from the text:

    private static ArrayList getLinksFromText(String text) {
            ArrayList links = new ArrayList();
    
            String regex = "\(?\b((http|https)://www[.])[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|]";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(text);
            while (m.find()) {
                String urlStr = m.group();
                if (urlStr.startsWith("(") && urlStr.endsWith(")")) {
                    urlStr = urlStr.substring(1, urlStr.length() - 1);
                }
                links.add(urlStr);
            }
            return links;
        }
    

    This can be used to remove one of the parameters in the clickify() method:

    public static void clickify(TextView view,
                                    final ClickSpan.OnClickListener listener) {
    
            CharSequence text = view.getText();
            String string = text.toString();
    
    
            ArrayList linksInText = getLinksFromText(string);
            if (linksInText.isEmpty()){
                return;
            }
    
    
            String clickableText = linksInText.get(0);
            ClickSpan span = new ClickSpan(listener,clickableText);
    
            int start = string.indexOf(clickableText);
            int end = start + clickableText.length();
            if (start == -1) return;
    
            if (text instanceof Spannable) {
                ((Spannable) text).setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            } else {
                SpannableString s = SpannableString.valueOf(text);
                s.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                view.setText(s);
            }
    
            MovementMethod m = view.getMovementMethod();
            if ((m == null) || !(m instanceof LinkMovementMethod)) {
                view.setMovementMethod(LinkMovementMethod.getInstance());
            }
        }
    

    A few changes to the ClickSpan:

    public static class ClickSpan extends ClickableSpan {
    
            private String mClickableText;
            private OnClickListener mListener;
    
            public ClickSpan(OnClickListener listener, String clickableText) {
                mListener = listener;
                mClickableText = clickableText;
            }
    
            @Override
            public void onClick(View widget) {
                if (mListener != null) mListener.onClick(mClickableText);
            }
    
            public interface OnClickListener {
                void onClick(String clickableText);
            }
        }
    

    Now you can simply set the text on the TextView and then add a listener to it:

    TextViewUtils.clickify(textWithLink,new TextUtils.ClickSpan.OnClickListener(){
    
    @Override
    public void onClick(String clickableText){
      //action...
    }
    
    });
    

提交回复
热议问题