2016-05-04 11 views
7

Der folgende Code zeigt, wie ich einen gedrückten Zustand mit einem benutzerdefinierten ClickableSpan und Selektor anwende. Der gedrückte Status wird jedoch immer dann angewendet, wenn ich irgendwo auf TextView drücke, nicht nur auf ClickableSpan. Wie höre ich damit auf?So verwenden Sie ClickableSpan, ignorieren jedoch Klicks aus dem TextView

Hinweis: es stellt nichtonClick, aberstate_pressedvon dem Selektor gilt. Ich will es auch nicht.

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

das 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> 

Notiz bearbeiten: Added Textview-Code

+0

zeigen den Code, wo Sie Ihre ClickableSpan Set in Textview –

+0

Haben Sie meine Lösung versucht? –

+0

@Fifer Schaf, möglicherweise suchen Sie nach dieser Lösung. http://stackoverflow.com/questions/20856105/change-the-text-color-of-a-single-clickablespan-when-pressed-without-affecting-o – TheGreat004

Antwort

0

Sie haben MovementMethod auf die Textview zu setzen, die den Span hat.

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

Hallo, Entschuldigung, ich hätte den TextView-Code, den ich bereits habe, hinzugefügt, da ich bereits eine Bewegungsmethode eingestellt habe. Ich habe diesen Code jetzt hinzugefügt. –

-1

Sie können auf diese Weise tun:

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

Hope this Ihnen helfen.

+0

In der Zeile 'span.setSpan (cs, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);', was ist 'cs'? –

+0

@Fifer Schaf, es ist die Zeichenfolge. Bedeutet die Zeichenfolge, auf die Sie die Spannweite festlegen möchten. –

+0

@FiferSheep, haben Sie die obige Lösung versucht? –

0

In Ihrem Code haben Sie

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

statt dessen definieren Sie Ihre Wähler wie zu definieren, unter

android:textColor="@drawable/my_selector" 

Rest des Codes ist, wie es Ihnen nur dann geändert haben, die einer Zeile ist, dass android:textColor="@drawable/my_selector" das erkläre ich oben.

+0

Das 'textColor' Attribut wird durch das' textColorLink' Attribut überschrieben - das hilft mir nicht weiter. Die Nicht-Link-Textfarbe ist in Ordnung. –

1

Nächstes Beispiel arbeitet als Sie erwarten:

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

Jetzt angewendet Spannweite: enter image description here

Hier ist MyClickableSpan() das ist, zeigen nur Snackbar, um anzuzeigen, dass "Klick" behandelt wird:

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

Wir haben:

  1. Klick-/Tap außerhalb des Textes "aufgespannt" nichts
  2. Click/tap tun wird auf "überspannt" Teil des Textes wird zeigen, Snackbar

enter image description here

Das ist es. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

1

Sie können unter Code beziehen ich habe es getestet.

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

Verwandte Themen