web-dev-qa-db-ja.com

別の単語のTextViewテキストをクリックまたはタップする方法は?

2つの異なる単語を含むテキストビューをクリックして別のビューに移動する方法。これは私が使用している文字列です。

By clicking Sign Up, you are indicating that you have read and agree to the 
Term of Use and Privacy Policy.

これらの2つの単語(利用規約、プライバシーポリシー)を異なる色でクリックできるようにしたい。

私は特定の単語の色を作る方法を知っています。クリック可能にしたい。

17

私はついに、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;
}
57
Boy

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);
        }
    }
}
14
phyzalis

複数の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>
8
pawelzieba

このライブラリをお勧めします: https://github.com/klinker24/Android-TextView-LinkBuilder

それはあなたの要件に非常によく合います。

簡単な概要:

enter image description here

コピーされたフォームプロジェクトのreadme:

  • TextView内の特定のWordのロングクリックアクションとショートクリックアクションを指定します
  • ユーザーがテキストに触れたときにテキストを強調表示してユーザーフィードバックを提供する単一の文字列に一致するか、正規表現を使用して、そのパターンに準拠するテキストへのクリック可能なリンクを設定します
  • リンクされたテキストの色を変更する
  • ユーザーがテキストに触れたときのテキストの強調表示の透明度を変更します
  • テキストに下線を付けるかどうかを設定します

TextViewの自動リンク機能よりもこのライブラリを使用する主な利点は、Webアドレス、電子メール、電話番号だけでなく、何でもリンクできることです。また、色のカスタマイズとタッチフィードバックも提供します。

2
fangzhzh

ClickableTextViewの実装では、文字列が繰り返されるWordを取得した場合はどうなりますか?たとえば、文字列が「クリック可能で、これもクリック可能」である場合、両方の文字列をスパン可能文字列に変更する必要がありますが、そのシナリオでは失敗し、一方のみがスパン可能文字列に変更されます。

0
Vinod Maralad