0

テキストビューとリンクがあります。リンクに触れたときにリンクを強調表示し、ロングクリックしたときにアラートダイアログを開きたいです。URLSpan をカスタマイズしてソリューションに到達しようとしましたが、OnClick が呼び出される前に mView にアクセスできないため、リスナーを設定できません。

class ConfirmSpan extends URLSpan{
    View mView;
    URLSpan span;

    public ConfirmSpan(URLSpan span) {
        super(span.getURL());
        this.span = span;

      //there is a nullpointerexception here since mView is null now.
        mView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                ((TextView)v).setBackgroundColor(0xcccccccc);
                return false;
            }
        });

      //this is also an exception
        mView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {

                Log.d("INFO","long click yay!");
                return false;
            }
        });
    }

  //this should be called to reach the view. But then I can't handle touch state.
    @Override
    public void onClick(View widget) {
        mView = widget;

        //bla bla..
    }

    public void openURL() {
        super.onClick(mView);
    }

}

LinkMovementMethod クラスをカスタマイズする必要があると思いますが、どうすればよいですか? どんなコメントでも大歓迎です。更新: このコードでタッチ イベントを処理できるようになりました:

public class CustomLinkMovementMethod extends LinkMovementMethod {
private static CustomLinkMovementMethod sInstance;

@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
    // Here I am changing backgorund color
    if(event.getAction() == MotionEvent.ACTION_DOWN)
        widget.setBackgroundColor(0xcccccccc);
    if(event.getAction() == MotionEvent.ACTION_UP)
        widget.setBackgroundColor(0xffffffff);
    return super.onTouchEvent(widget, buffer, event);
}
public static MovementMethod getInstance() {
    if (sInstance == null)
        sInstance = new CustomLinkMovementMethod();

    return sInstance;
}

}

しかし、パラメーター OnTouchEvent() であるウィジェットという名前の TextView は、私が望むものではありません。全文です。そのため、リンクに触れると、テキストが全体的に灰色になります。リンクの開始行と終了行の座標を見つけて、リンクの背景に色を付けるなど、他の方法が必要だと思います。

4

1 に答える 1

3

この質問をしていただきありがとうございます。解決策があると思います。

https://gist.github.com/qtyq/90f9b4894069a8b3676cのコードを確認してください

これは、次の方法で SpannableString を簡単に作成できる SpannableString のファクトリ ヘルパー クラスです。

  1. 元の文字列を static init(String s) メソッドに渡す
  2. makeLink(...) メソッドを呼び出して、必要な部分文字列をリンクにする
  3. オプションで、makeBold(...) (すでに makeLink で呼び出されています) や setColor(...) などの他のメソッドを呼び出して、外観をカスタマイズします。
  4. 最後に create() を呼び出して SpannableString オブジェクトを作成します。これを setText(...) で textView に適用するだけです。

使用例を次に示します。

SpannableString ss = SpannableBuilder.init(bottomText)
        .setColor("Terms & Conditions", getResources().getColor(R.color.orange))
        .makeLink(getContext(), "Terms & Conditions", terms)
        .setColor("Privacy Policy", getResources().getColor(R.color.orange))
        .makeLink(getContext(), "Privacy Policy", policy)
        .create();
textView1.setText(ss);

もちろん、そのクラスに既にあるメソッドをカスタマイズしたり、さらにカスタマイズが必要な場合は独自のメソッドを追加したりできます。できることの詳細については、Google の SpannableString に関するドキュメントを参照してください。

于 2015-06-09T01:21:23.957 に答える