2016-08-26 3 views
1

リンククリックを処理するカスタムTextViewがあります。私はユーザーがそれを押すときにリンクを強調したい。これは私のカスタムTextViewのコードです。カスタムテキストビューのAndroidハイライトリンクテキスト

package com.example.app.ui.extensions; 

import android.app.Activity; 
import android.content.Context; 
import android.text.Layout; 
import android.text.Selection; 
import android.text.Spannable; 
import android.text.style.ClickableSpan; 
import android.text.util.Linkify; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.widget.TextView; 

import com.example.app.helpers.LinkClickHelper; 

public class LinkifyTextView extends TextView { 
    public LinkifyTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public LinkifyTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public LinkifyTextView(Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     this.setAutoLinkMask(Linkify.WEB_URLS); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     super.onTouchEvent(event); 
     final Object text = getText(); 
     if (text instanceof Spannable) { 
      final Spannable buffer = (Spannable) text; 
      final int action = event.getAction(); 

      if (action == MotionEvent.ACTION_UP 
        || action == MotionEvent.ACTION_DOWN) { 
       int x = (int) event.getX(); 
       int y = (int) event.getY(); 

       x -= getTotalPaddingLeft(); 
       y -= getTotalPaddingTop(); 

       x += getScrollX(); 
       y += getScrollY(); 

       final Layout layout = getLayout(); 
       final int line = layout.getLineForVertical(y); 
       final int off = layout.getOffsetForHorizontal(line, x); 

       final ClickableSpan[] link = buffer.getSpans(off, off, 
         ClickableSpan.class); 

       if (link.length != 0) { 
        if (action == MotionEvent.ACTION_UP) { 
         int start = buffer.getSpanStart(link[0]); 
         int end = buffer.getSpanEnd(link[0]); 
         CharSequence linkText = ((Spannable) text).subSequence(start, end); 

         LinkClickHelper.openLink((Activity) getContext(), linkText.toString()); 
        } else { 
         Selection.setSelection(buffer, 
           buffer.getSpanStart(link[0]), 
           buffer.getSpanEnd(link[0])); 
        } 
       } 
      } 
     } 
     return true; 
    } 

    @Override 
    public void setText(CharSequence text, BufferType type) { 
     super.setText(text, type); 
     this.setMovementMethod(null); 
    } 

} 

これはあなたがSETTEXTCOLOR()を使用することができ、レイアウトのコード

<com.example.app.ui.extensions.LinkifyTextView 
     android:id="@+id/description_text_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="?android:selectableItemBackground" 
     android:clickable="true" 
     android:ellipsize="end"   
     android:scrollHorizontally="true" 
     android:textColor="@color/text_color_secondary_73" 
     android:textColorLink="@color/link_selector" 
     /> 

答えて

0

です。しかし、このカスタムテキストビューにはsetTextColor()メソッドは含まれていません。したがって、setTextColor()メソッドで他のカスタムテキストビューを使用する必要があります。

0

TextViewでこれを使用します。リンクを検出します。

    android:textColorHighlight="@color/yellow" 
        android:textColor="@color/black" 
        android:autoLink="link" 
        android:textColorLink="@color/blue" 
0

さらに検索したところ、自分のコードに問題のある場所が見つかりました。 this.setMovementMethod(LinkMovementMethod.getInstance()); this.setLinkTextColor(ContextCompat.getColorStateList(App.getContext(), R.color.link_selector)); また、スーパークラスへのリンククリックをしないようにし、onTouchメソッドで自分自身でリンクを開くように処理しました。 ショートリンクハイライトはシステムで処理され、リンクオープンは私によって処理されます。以下は私の作業コードです。

public class LinkifyTextView extends TextView { 
    public LinkifyTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public LinkifyTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public LinkifyTextView(Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     this.setAutoLinkMask(Linkify.WEB_URLS); 
     this.setMovementMethod(LinkMovementMethod.getInstance()); 
     this.setLinkTextColor(ContextCompat.getColorStateList(App.getContext(), R.color.link_selector)); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     final Object text = getText(); 
     if (text instanceof Spannable) { 
      final Spannable buffer = (Spannable) text; 
      final int action = event.getAction(); 

      if (action == MotionEvent.ACTION_UP 
        || action == MotionEvent.ACTION_DOWN) { 
       int x = (int) event.getX(); 
       int y = (int) event.getY(); 

       x -= getTotalPaddingLeft(); 
       y -= getTotalPaddingTop(); 

       x += getScrollX(); 
       y += getScrollY(); 

       final Layout layout = getLayout(); 
       final int line = layout.getLineForVertical(y); 
       final int off = layout.getOffsetForHorizontal(line, x); 

       final ClickableSpan[] link = buffer.getSpans(off, off, 
         ClickableSpan.class); 

       if (link.length != 0) { 
        if (action == MotionEvent.ACTION_UP) { 
         int start = buffer.getSpanStart(link[0]); 
         int end = buffer.getSpanEnd(link[0]); 
         CharSequence linkText = ((Spannable) text).subSequence(start, end); 

         LinkClickHelper.openLink((Activity) getContext(), linkText.toString()); 
         //prevent opening link by system 
         return false; 
        } else { 
         super.onTouchEvent(event); 
         Selection.setSelection(buffer, 
           buffer.getSpanStart(link[0]), 
           buffer.getSpanEnd(link[0])); 
        } 
       } else { 
        super.onTouchEvent(event); 
       } 
      } else { 
       super.onTouchEvent(event); 
      } 
     } 
     return true; 
    } 

} 
関連する問題