2016-05-04 8 views
7

Il codice seguente mostra come sto applicando uno stato premuto utilizzando un ClickableSpan e un selettore personalizzati. Tuttavia, lo stato premuto viene applicato ogni volta che premo su TextView, non solo su ClickableSpan. Come lo fermo?Come utilizzare ClickableSpan, ma ignorare i clic dal TextView

Nota: non chiamaonClick, ma si applicastate_presseddal selettore. Voglio che non faccia né l'uno né l'altro.

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> 

Modifica nota: il codice Aggiunto TextView

+0

mostrano il codice in cui si imposta la ClickableSpan in TextView –

+0

Hai provato la mia soluzione? –

+0

@Fifer Sheep, forse stai cercando questa soluzione. http://stackoverflow.com/questions/20856105/change-the-text-color-of-a-single-clickablespan-when-pressed-without-affecting-o – TheGreat004

risposta

0

È necessario impostare MovementMethod al TextView che ha lo Span.

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

Ciao, scusa avrei dovuto aggiungere il codice TextView che ho già, dato che ho già impostato un metodo di spostamento. Ho aggiunto questo codice ora. –

-1

Si può fare in questo modo:

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()); 

Spero che questo vi aiuterà.

+0

Nella riga 'span.setSpan (cs, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);', che cos'è 'cs'? –

+0

@Fifer Sheep, è la stringa di caratteri. Indica la stringa su cui si desidera impostare l'intervallo. –

+0

@FiferSheep, hai provato sopra la soluzione? –

0

Nel codice si dispone di definire

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

invece di questo si deve definire il selettore come qui di seguito

android:textColor="@drawable/my_selector" 

resto del codice è in quanto è che devi cambiato una sola linea che android:textColor="@drawable/my_selector" che spiego sopra.

+0

L'attributo 'textColor' è sovrascritto dall'attributo' textColorLink' - quindi questo non mi aiuta. Il colore del testo senza collegamento va bene. –

1

esempio seguente funziona come ci si aspetta:

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

abbracciano attualmente applicata: enter image description here

Ecco MyClickableSpan() che è mostrano soltanto Snackbar per indicare che "clic" è gestito:

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(); 
    } 
} 

Abbiamo:

  1. Click/rubinetto esterno il testo "attraversato" non farà nulla
  2. Click/tap su "attraversato" parte di testo mostrerà Snackbar

enter image description here

Questo è tutto. Per favore fatemi sapere se avete bisogno di ulteriori informazioni.

1

È possibile consultare il codice riportato di seguito che l'ho provato.

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

Problemi correlati