2つの異なる単語を含むテキストビューをクリックして別のビューに移動する方法。これは私が使用している文字列です。
By clicking Sign Up, you are indicating that you have read and agree to the
Term of Use and Privacy Policy.
これらの2つの単語(利用規約、プライバシーポリシー)を異なる色でクリックできるようにしたい。
私は特定の単語の色を作る方法を知っています。クリック可能にしたい。
私はついに、TextViewに複数のクリック可能なパーツを含める方法を理解しました。それらすべてが独自のClickableSpanを持っていることが重要です!それは私がそれを最初にテストしたときに間違っていたところです。それらが同じClickableSpanインスタンスを持っている場合、最後に設定されたスパンのみが記憶されます。
必要なクリック可能領域が「[」と「]」で囲まれた文字列を作成しました。
String sentence = "this is [part 1] and [here another] and [another one]";
これがsetTextViewで、setMovementMehthodも必須です。
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(addClickablePart(sentence), BufferType.SPANNABLE);
クリック可能な領域の作成を処理するこの関数を作成しました。
private SpannableStringBuilder addClickablePart(String str) {
SpannableStringBuilder ssb = new SpannableStringBuilder(str);
int idx1 = str.indexOf("[");
int idx2 = 0;
while (idx1 != -1) {
idx2 = str.indexOf("]", idx1) + 1;
final String clickString = str.substring(idx1, idx2);
ssb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(getView().getContext(), clickString,
Toast.LENGTH_SHORT).show();
}
}, idx1, idx2, 0);
idx1 = str.indexOf("[", idx2);
}
return ssb;
}
Boyの応答に基づいて(そして私を大いに助けてくれたあなたの応答に感謝します)、クリック可能な単語を記述するために内部クラスを使用して、この '['および ']'文字なしで実装した別の方法があります:
import Java.util.List;
import Android.content.Context;
import Android.text.SpannableStringBuilder;
import Android.text.method.LinkMovementMethod;
import Android.text.style.ClickableSpan;
import Android.util.AttributeSet;
import Android.widget.TextView;
/**
* Defines a TextView widget where user can click on different words to see different actions
*
*/
public class ClickableTextView extends TextView {
public ClickableTextView(Context context) {
super(context);
}
public ClickableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ClickableTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setTextWithClickableWords(String text, List<ClickableWord> clickableWords) {
setMovementMethod(LinkMovementMethod.getInstance());
setText(addClickablePart(text, clickableWords), BufferType.SPANNABLE);
}
private SpannableStringBuilder addClickablePart(String str, List<ClickableWord> clickableWords) {
SpannableStringBuilder ssb = new SpannableStringBuilder(str);
for (ClickableWord clickableWord : clickableWords) {
int idx1 = str.indexOf(clickableWord.getWord());
int idx2 = 0;
while (idx1 != -1) {
idx2 = idx1 + clickableWord.getWord().length();
ssb.setSpan(clickableWord.getClickableSpan(), idx1, idx2, 0);
idx1 = str.indexOf(clickableWord.getWord(), idx2);
}
}
return ssb;
}
public static class ClickableWord {
private String Word;
private ClickableSpan clickableSpan;
public ClickableWord(String Word, ClickableSpan clickableSpan) {
this.Word = Word;
this.clickableSpan = clickableSpan;
}
/**
* @return the Word
*/
public String getWord() {
return Word;
}
/**
* @return the clickableSpan
*/
public ClickableSpan getClickableSpan() {
return clickableSpan;
}
}
}
これが誰かを助けるかもしれないことを願っています
編集:リンクの色を変更して下線を削除する方法:
次のようにClickableSpanの独自の実装を作成して使用します。
//a version of ClickableSpan without the underline
public static class NoUnderlineClickableSpan extends ClickableSpan {
private int color = -1;
public void setColor(int color) {
this.color = color;
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
if (this.color != -1) {
ds.setColor(this.color);
}
}
}
複数のTextViewを作成し、レイアウトやリスナーなどに注意するよりも、TextViewのリンクでHTMLを使用する方がはるかに簡単です。
あなたの活動または断片:
TextView mText = (TextView) findViewById(R.id.text_linkified);
mText.setText(Html.fromHtml("Open <a href='myapp://my-activity'>My Activity</a> or" +
" <a href='myapp://other-activity'>Other Activity</a>"));
mText.setMovementMethod(LinkMovementMethod.getInstance());
マニフェストで
<activity Android:name=".MyActivity">
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT"/>
<data Android:scheme="myapp" Android:Host="my-activity"/>
</intent-filter>
</activity>
<activity Android:name=".MyOtherActivity">
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT"/>
<data Android:scheme="myapp" Android:Host="other-activity" />
</intent-filter>
</activity>
このライブラリをお勧めします: https://github.com/klinker24/Android-TextView-LinkBuilder
それはあなたの要件に非常によく合います。
簡単な概要:
コピーされたフォームプロジェクトのreadme:
TextViewの自動リンク機能よりもこのライブラリを使用する主な利点は、Webアドレス、電子メール、電話番号だけでなく、何でもリンクできることです。また、色のカスタマイズとタッチフィードバックも提供します。
ClickableTextViewの実装では、文字列が繰り返されるWordを取得した場合はどうなりますか?たとえば、文字列が「クリック可能で、これもクリック可能」である場合、両方の文字列をスパン可能文字列に変更する必要がありますが、そのシナリオでは失敗し、一方のみがスパン可能文字列に変更されます。