2016-05-04 8 views
7

Poniższy kod przedstawia sposób stosowania naciśniętego stanu za pomocą niestandardowej opcji ClickableSpan i selektora. Jednak naciśnięty stan jest stosowany zawsze, gdy naciśniesz w dowolnym miejscu na TextView, a nie tylko na ClickableSpan. Jak mogę to zatrzymać?Sposób korzystania z obiektu ClickableSpan, ale ignorowanie kliknięć z poziomu TextView

Uwaga: to nie wymagaonClick, ale ma zastosowaniastate_pressedz selektora. Chcę, żeby to nie było.

MyView.java

SpannableString spanned = new SpannableString("click here"); 
spannable.setSpan(new MyClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      doSomething(); 
     } 
    }, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
textView.setText(spanned); 
textView.setMovementMethod(LinkMovementMethod.getInstance()); 

MyClickableSpan.java

public abstract class MyClickableSpan extends ClickableSpan { 

    @Override 
    public abstract void onClick(View view); 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     super.updateDrawState(ds); 
     ds.setUnderlineText(false); 
    } 
} 

TextView

<TextView 
    android:id="@+id/my_text_view" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="@android:color/white" 
    android:textColorLink="@color/my_selector" /> 

my_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:color="@color/my_color_pressed" /> 
    <item android:color="@color/my_color" /> 
</selector> 

Edit uwaga: kod Dodany TextView

+0

pokazać kod gdzie ustawić swoją ClickableSpan do TextView –

+0

Czy próbowałeś mojego rozwiązanie? –

+0

@Fifer Sheep, może być u szukasz tego rozwiązania. http://stackoverflow.com/questions/20856105/change-the-text-color-of-a-single-clickablespan-when-pressed-without-affecting-o – TheGreat004

Odpowiedz

0

Musisz ustawić MovementMethod do TextView który ma rozpiętość.

textView.setMovementMethod(LinkMovementMethod.getInstance()); 
+0

Witam, przepraszam, że powinienem dodać kod TextView, który już mam, ponieważ już ustawiłem metodę ruchu. Dodałem ten kod teraz. –

-1

Można to zrobić w ten sposób:

TextView textView = (TextView)findViewById(R.id.textView); 
Spannable span = Spannable.Factory.getInstance().newSpannable("test link span"); 
span.setSpan(new ClickableSpan() { 
    @Override 
    public void onClick(View v) { 
     Log.i("main", "Link clicked"); 
     Toast.makeText(HomeScreenActivity.this, "link clicked", Toast.LENGTH_SHORT).show(); 
     } }, 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

    // set the "test " spannable. 
     span.setSpan(cs, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

    // set the " span" spannable 
     span.setSpan(cs, 6, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

textView.setText(span); 
textView.setMovementMethod(LinkMovementMethod.getInstance()); 

nadzieję, że to pomoże.

+0

W linii 'span.setSpan (cs, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);', co to jest 'cs'? –

+0

@Fifer Sheep, to ciąg znaków. Oznacza twój ciąg, na którym chcesz ustawić span. –

+0

@FiferSheep, czy próbowałeś powyższego rozwiązania? –

0

W kodzie masz określić

android:textColor="@android:color/white" 

tego trzeba zdefiniować selektor jak poniżej

android:textColor="@drawable/my_selector" 

reszta kodu jest to trzeba zmienić tylko jedną linię zamiast tego android:textColor="@drawable/my_selector", które wyjaśnię powyżej.

+0

Atrybut 'textColor' jest nadpisywany przez atrybut' textColorLink' - więc to mi nie pomoże. Kolor tekstu bez linków jest w porządku. –

1

Następny przykład działa jak czekasz:

Spannable span = SpannableStringBuilder.valueOf("Hello clickable span!"); 
    span.setSpan(new MyClickableSpan(), 6, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    mTextView.setText(span); 
    mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 

Teraz rozpiętość zastosowano: enter image description here

Tutaj tylko MyClickableSpan(), które pokazują, bar przekąskowy, aby wskazać, że "kliknięcie" jest obsługiwane:

class MyClickableSpan extends ClickableSpan { 

    @Override 
    public void onClick(View widget) { 
     Snackbar.make(getWindow().findViewById(android.R.id.content), "Click on span!", Snackbar.LENGTH_LONG).show(); 
    } 
} 

Mamy:

  1. Kliknij/kran na zewnątrz „trwającej” tekst zrobi nic
  2. kliknięcie/kran „łączony” część tekstu pokaże Snackbar

enter image description here

To wszystko. Daj mi znać, jeśli potrzebujesz dodatkowych informacji.

1

Możesz odnieść się do poniższego kodu, który przetestowałem.

String s = "This is custom string click Here"; 
    SpannableString spanned = new SpannableString(s); 
    spanned.setSpan(new MyClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      Log.i("main", "Link clicked"); 
     } 
    }, s.length() - 10, s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    textView.setText(spanned); 
    textView.setMovementMethod(LinkMovementMethod.getInstance()); 

TextView

<TextView 
    android:id="@+id/my_text_view" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textColor="@drawable/my_selector" 
    android:textColorLink="@color/colorPrimary" /> 

You can use tutorial here

Powiązane problemy