簡體   English   中英

將OnTouch和OnClickListener添加到TextView中的鏈接並更改鏈接的背景顏色

[英]Adding OnTouch and OnClickListener to the links in a TextView and changing background color of the link

我有一個textview和鏈接。 我希望在觸摸鏈接時突出​​顯示這些鏈接,並且在長按它們時也想打開一個Alertdialog。 我嘗試通過自定義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;
}

}

但是,TextView命名為小部件(參數OnTouchEvent())不是我想要的。 這是全部文字。 因此,當我觸摸鏈接時,文本將全部變為灰色。 我想我需要其他一些方法,例如通過查找鏈接的開始和結束線的坐標來為鏈接的背景着色。

感謝您提出這個問題,我想我可能會為您提供解決方案。

https://gist.github.com/qtyq/90f9b4894069a8b3676c中查看代碼

它是SpannableString的工廠幫助程序類,它允許您通過以下方式輕松創建SpannableString:

  1. 將原始String傳遞到靜態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文檔,以獲取有關您可以執行的操作的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM