2013-10-07 15 views
19

TextViewでいくつかのクリック可能な部分を作る方法を教えてください。クリック可能な部分にはそれぞれ独自のアクションが必要です。TextViewでいくつかのクリック可能なテキストを作る方法

+1

あなたは、電話、電子メール、ウェブなどのデフォルトのアクションでLinkifyを使用することができます。 – wolverine

+0

異なるテキストビューを使用してみてください。可能であれば、簡単な回避策。 –

+0

スパニング可能な文字列を使用 – Raghunandan

答えて

48

あなたは、私がメインのテキストと異なるリソースでクリック可能なワードを記憶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()); 
+1

NICE !!!!!!!!!!!! –

+2

それは動作します。なぜsetMovementMethodが必要なのでしょうか? – degratnik

+0

ああ、リンク間を移動するための移動方法を設定しました – stinepike

3

を使用することができます。

一部の構成では、リソース内の文字列が存在しません。

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); 
    } 
-1

これは私のために働いている: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" /> 
の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> 

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());