How can I make several clickable parts of text in TextView

前端 未结 3 374
清酒与你
清酒与你 2020-12-23 22:59

How can I make several clickable parts of text in TextView. Every clickable part must have his own action.

相关标签:
3条回答
  • 2020-12-23 23:27

    I store main text and clickable words in different resources.

    Strings in resources does not exist for some configurations.

        String[] links = new String[3];
    
        links[0] = cntx.getString(cntx.getResources().getIdentifier("footerLink1", "string", cntx.getPackageName()));
        links[1] = cntx.getString(cntx.getResources().getIdentifier("footerLink2", "string", cntx.getPackageName()));
        links[2] = cntx.getString(cntx.getResources().getIdentifier("footerLink3", "string", cntx.getPackageName()));
        String text = String.format(cntx.getString(cntx.getResources().getIdentifier("footerDisclaimer", "string", cntx.getPackageName())), links[0], links[1], links[2]);
        SpannableString ss = new SpannableString(text);
        setSpanOnLink(ss, links[0], new ClickableSpan() {
            @Override
            public void onClick(View textView) {
                Log.i("Disclaimer Footer", "1 click");
                //TODO run item 
            }
        });
        setSpanOnLink(ss, links[1], new ClickableSpan() {
            @Override
            public void onClick(View textView) {
                Log.i("Disclaimer Footer", "2 click");
                //TODO run item 
            }
        });
        setSpanOnLink(ss, links[2], new ClickableSpan() {
            @Override
            public void onClick(View textView) {
                Log.i("Disclaimer Footer", "3click");
                //TODO run item 
            }
        });
    
        TextView t1 = new TextView(cntx);
        t1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 8);
        t1.setText(ss);
        t1.setMovementMethod(LinkMovementMethod.getInstance());
    
    private void setSpanOnLink(SpannableString ss, String link, ClickableSpan cs) {
            String text = ss.toString();
            int start = text.indexOf(link);
            int end = start + link.length();
            ss.setSpan(cs, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    
    0 讨论(0)
  • 2020-12-23 23:32

    This is working for me :

    in xml :

        <TextView
            android:id="@+id/tv_by_continuing_str"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:textSize="15sp"
            tools:text="Test msg 1 2, 3"
            android:textColor="@color/translucent_less_white3"
            android:textColorLink="@color/white"
            android:gravity="center|bottom"
            android:layout_above="@+id/btn_privacy_continue" />
    

    In strings.xml

    < string name="by_continuing_str2">< ! [ CDATA[By continuing to use this app, you agree to our <a href="https://go.test.com" style="color:gray"/> Privacy Statement </a> and <a href="https://go.test.com" style="color:gray"/>Services Agreement.]]>< / string>
    

    in the activity :

    TextView tv_by_continuing = (TextView) findViewById(R.id.tv_by_continuing);
    tv_by_continuing.setText(Html.fromHtml(getString(R.string.by_continuing_str2)));
    tv_by_continuing.setMovementMethod(LinkMovementMethod.getInstance());
    
    0 讨论(0)
  • 2020-12-23 23:51

    you can use android.text.style.ClickableSpan

        SpannableString ss = new SpannableString("Hello World");
        ClickableSpan span1 = new ClickableSpan() {
            @Override
            public void onClick(View textView) {
                // do some thing
            }
        };
    
        ClickableSpan span2 = new ClickableSpan() {
            @Override
            public void onClick(View textView) {
                // do another thing
            }
        };
    
        ss.setSpan(span1, 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(span2, 6, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
        textView.setText(ss);
        textView.setMovementMethod(LinkMovementMethod.getInstance());
    
    0 讨论(0)
提交回复
热议问题