2016-08-26 2 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); 
    } 

} 

это код макета

<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(). Поэтому u должен использовать любое другое пользовательское текстовое представление с помощью метода 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; 
    } 

}