Android 如何为单个文本视图设置多个单击事件?

Android 如何为单个文本视图设置多个单击事件?,android,string,dynamic,textview,clickablespan,Android,String,Dynamic,Textview,Clickablespan,我有一个文本视图,如下所示: txtByRegistering.setText("By Registering you agree to terms and condition and privacy policy"); 这只是一篇大文章。所以,我用选框来水平滚动文本。那很好。我的问题是,如何在单击所选滚动文本时调用click事件 例如: 当用户在上面的文本视图中单击单词“注册”时,我必须调用新的意图 当用户点击“术语”一词时,我必须 调用另一个新的意图(术语为webview的活动具有URL链

我有一个文本视图,如下所示:

txtByRegistering.setText("By Registering you agree to terms and condition and privacy policy");
这只是一篇大文章。所以,我用选框来水平滚动文本。那很好。我的问题是,如何在单击所选滚动文本时调用click事件

例如:

  • 当用户在上面的文本视图中单击单词“注册”时,我必须调用新的意图
  • 当用户点击“术语”一词时,我必须 调用另一个新的意图(术语为webview的活动具有
    URL链接
  • 由于“注册”和“术语”都是Web URL,我尝试了以下方法:

        String mRegDesc = "By registering you agree to the " + "<a href=\""
                + Constant.URL + "/terms_and_conditions"
                + "\">Terms of Use</a> " + "and " + "<a href=\"" + Constant.URL
                + "/privacy" + "\">Privacy Policy</a> ";
    
        txtByRegistering.setText(Html.fromHtml(mRegDesc));
        txtByRegistering.setMovementMethod(LinkMovementMethod.getInstance());
        txtByRegistering.setSelected(true);
        txtByRegistering.setTypeface(mTyFaceOverLockReg, Typeface.BOLD);
    
    String mRegDesc=“通过注册您同意“+”+”和“+”;
    txtByRegistering.setText(Html.fromHtml(mRegDesc));
    setMovementMethod(LinkMovementMethod.getInstance());
    txtByRegistering.setSelected(true);
    setTypeface(mTyFaceOverLockReg,Typeface.BOLD);
    
    上面的代码工作正常,当我单击“术语”一词时,它会将我带到浏览器,但我希望转到新活动。

    最后

    我找到了解决办法

    以下是解决方案:

        SpannableString SpanString = new SpannableString(
                "By Registering you agree to the Terms of Use and Privacy Policy");
    
        ClickableSpan teremsAndCondition = new ClickableSpan() {
            @Override
            public void onClick(View textView) {
    
    
                Intent mIntent = new Intent(SignUp.this, CommonWebView.class);
                mIntent.putExtra("isTermsAndCondition", true);
                startActivity(mIntent);
    
            }
        };
    
       // Character starting from 32 - 45 is Terms and condition. 
       // Character starting from 49 - 63 is privacy policy. 
    
        ClickableSpan privacy = new ClickableSpan() {
            @Override
            public void onClick(View textView) {
    
                Intent mIntent = new Intent(SignUp.this, CommonWebView.class);
                mIntent.putExtra("isPrivacyPolicy", true);
                startActivity(mIntent);
    
            }
        };
    
        SpanString.setSpan(teremsAndCondition, 32, 45, 0);
        SpanString.setSpan(privacy, 49, 63, 0);
        SpanString.setSpan(new ForegroundColorSpan(Color.BLUE), 32, 45, 0);
        SpanString.setSpan(new ForegroundColorSpan(Color.BLUE), 49, 63, 0);
        SpanString.setSpan(new UnderlineSpan(), 32, 45, 0);
        SpanString.setSpan(new UnderlineSpan(), 49, 63, 0);
    
        txtByRegistering.setMovementMethod(LinkMovementMethod.getInstance());
        txtByRegistering.setText(SpanString, BufferType.SPANNABLE);
        txtByRegistering.setSelected(true);
    

    感谢Shayan pourvatan。

    假设这是您的完整字符串

    通过注册,我同意条款和隐私政策

    您要使其可单击的字符串是

    条款隐私政策

    所以,这是我的诀窍

    ClickableSpan terms = new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            new Utils(getActivity()).shortToast("Terms");
    
        }
    };
    
    ClickableSpan privacy = new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            new Utils(getActivity()).shortToast("Privacy");
    
        }
    };
    
    此功能的主要功能

    public void setClickableString(String wholeValue, TextView textView, final String[] clickableValue, ClickableSpan[] clickableSpans) {
        SpannableString spannableString = new SpannableString(wholeValue);
    
        for (int i = 0; i < clickableValue.length; i++) {
            ClickableSpan clickableSpan = clickableSpans[i];
            String link = clickableValue[i];
    
            int startIndexOfLink = wholeValue.indexOf(link);
            spannableString.setSpan(clickableSpan, startIndexOfLink, startIndexOfLink + link.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        textView.setHighlightColor(
                Color.TRANSPARENT); // prevent TextView change background when highlight
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        textView.setText(spannableString, TextView.BufferType.SPANNABLE);
    }
    

    使用这一个它对我有效在单一文本视图中单击两次

    步骤1-:您的文本将显示在SpannableString中

    第2步:-像这样添加点击可点击范围

    最后一步添加您的点击SpannableString和字符开始和结束索引,如注册单词在第3位开始,在11位结束,所以添加点击注册单词

    在文本视图中添加您的SpannableString后的术语相同


    我建议在下面的代码中使用
    TextView
    中的可点击字符串,它是动态的。 此代码的优点是,如果您多次使用相同的
    字符串
    ,则可以同时单击两个
    字符串
    。例如,如果您想设置单击,字符串是
    男孩正在打板球<代码>男孩正在踢足球
    男孩
    是两个单词的两倍,两个单词都可以点击

        public void setClicksOnString(String completeString, List<String> stringsToClick, TextView textView) {
            SpannableString spannableString = new SpannableString(completeString);
            for (int m = 0; m < stringsToClick.size(); m++) {
                Matcher matcher = Pattern.compile(stringsToClick.get(m)).matcher(spannableString);
                while (matcher.find()) {
                    ClickableSpan stringClick = new ClickableSpan() {
                        @Override
                        public void onClick(View widget) {
                            //you compare the string and your click logics
    
                        }
                    };
                    spannableString.setSpan(stringClick, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    
                }
            }
            textView.setHighlightColor(
                    Color.TRANSPARENT); // prevent TextView change background when highlight
            textView.setMovementMethod(LinkMovementMethod.getInstance());
            textView.setText(spannableString, TextView.BufferType.SPANNABLE);
    
        }
    
    public void setClicksOnString(字符串完成字符串、列表字符串单击、文本视图文本视图){
    SpannableString SpannableString=新的SpannableString(completeString);
    对于(int m=0;m
    此外,如果您想知道用户在哪个文本中动态单击,请使用下面的

     ClickableSpan listener = new ClickableSpan() {
                @Override
                public void onClick(View textView) {
                    TextView tv = (TextView) textView;
                    Spanned s = (Spanned) tv.getText();
                    int start = s.getSpanStart(this);
                    int end = s.getSpanEnd(this);
                    String clickedText = s.toString().substring(start,end);
                }
            };
    

    我想您需要
    ClickableSpan
    ,请参见@Shayanpourvatan上的我的答案我可以为单个
    spannablesting设置多个
    ClickableSpan
    ?请你再详细一点好吗?SpannableString支持API级别8?是的,您可以在一个字符串上设置多个ClickAbable,并且此方法添加到API级别1上。有关更多信息,请参阅以及如何更改下划线颜色的任何想法,请与我联系!向你致意
     ClickableSpan Registering = new ClickableSpan() {
            @Override
            public void onClick(View textView) {
                Intent intent=new Intent(this,WebView_Activity.class);
                                startActivity(intent);
            }
            @Override
            public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setUnderlineText(true);
            }
        };
        ClickableSpan terms = new ClickableSpan() {
            @Override
            public void onClick(View textView) {
    
                Intent intent=new Intent(this,WebView_Activity.class);
                                startActivity(intent);
            }
            @Override
            public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setUnderlineText(true);
            }
        };
    
     ss.setSpan(Registering , 3, 11, 0);
    
      textview.setMovementMethod(LinkMovementMethod.getInstance());
        textview.setText(ss, TextView.BufferType.SPANNABLE);
        textview.setSelected(true);
    
        public void setClicksOnString(String completeString, List<String> stringsToClick, TextView textView) {
            SpannableString spannableString = new SpannableString(completeString);
            for (int m = 0; m < stringsToClick.size(); m++) {
                Matcher matcher = Pattern.compile(stringsToClick.get(m)).matcher(spannableString);
                while (matcher.find()) {
                    ClickableSpan stringClick = new ClickableSpan() {
                        @Override
                        public void onClick(View widget) {
                            //you compare the string and your click logics
    
                        }
                    };
                    spannableString.setSpan(stringClick, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    
                }
            }
            textView.setHighlightColor(
                    Color.TRANSPARENT); // prevent TextView change background when highlight
            textView.setMovementMethod(LinkMovementMethod.getInstance());
            textView.setText(spannableString, TextView.BufferType.SPANNABLE);
    
        }
    
     ClickableSpan listener = new ClickableSpan() {
                @Override
                public void onClick(View textView) {
                    TextView tv = (TextView) textView;
                    Spanned s = (Spanned) tv.getText();
                    int start = s.getSpanStart(this);
                    int end = s.getSpanEnd(this);
                    String clickedText = s.toString().substring(start,end);
                }
            };