2013-01-03 18 views
6

È possibile aggiungere onclick a una porzione di una vista testo? Per esempio il mio codice va in questo modo,TextView - OnClick - Android

String content = "Hello this a test.. For more details contact @Peter"; 
someTextView.setText(content); 

Vorrei aggiungere un evento onClick per "@Peter". È possibile?

TIA.

+0

si desidera aggiungere "onclick' all'intero' textview' o solo ** @ Peter **? – Renjith

+0

Questo potrebbe aiutarti: http://stackoverflow.com/questions/2734270/how-do-i-make-links-in-a-textview-clickable oppure puoi farlo con Spannables e IntentSpan. – Thommy

+0

@RKN aggiungi 'onclick' solo per ** @ Peter ** – Naveen

risposta

2

Questo è possibile appassire utilizzando il codice Java:

someTextView.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(){ 
     //Do Stuff 
    } 
}); 

Ma in primo luogo fare in modo che lo si imposta cliccabile.

someTextView.setClickable(true); 
+2

Mi piacerebbe" onclick "solo per una parte della vista testo e non per l'intera visualizzazione testo. – Naveen

4

In te Xml aggiungere questo, android:clickable="true"

in voi uso un'attività come questa,

textView.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(){ 

    } 
} 
+1

Questo aggiungerà un evento click per l'intera textview. Vorrei aggiungerlo solo per una parte .. nel caso sopra menzionato per ** @ Peter ** – Naveen

+0

@Peter: fai riferimento a questo link, spero che questo possa aiutarti http://adilatwork.blogspot.in/2011/07/android-how-to-make-only-part-of.html – Aerrow

7

Semplice: -)

SpannableString link = makeLinkSpan("@Peter", new View.OnClickListener() {   
     @Override 
     public void onClick(View v) { 
      // Peforme Click 
     } 
    }); 
String content = "Hello this a test.. For more details contact"; 
someTextView.setText(content); 
someTextView.append(link); 

E makeLinkSpan() metodo è

private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener) { 
    SpannableString link = new SpannableString(text); 
    link.setSpan(new ClickableString(listener), 0, text.length(), 
     SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); 
    return link; 
} 

ClickableString Classe

private static class ClickableString extends ClickableSpan { 
    private View.OnClickListener mListener;   
    public ClickableString(View.OnClickListener listener) {    
     mListener = listener; 
    }   
    @Override 
    public void onClick(View v) { 
     mListener.onClick(v); 
    }   
} 
+0

Ora, hai solo l'evento Click per il testo "@Peter". Non per TextView completo. Significa che la tua parola @Peter è collegata .. – user370305

1

Prova questa:

SpannableString str = new SpannableString("@Peter"); 
str.setSpan(new ClickableSpan() { 

      @Override 
      public void onClick(View widget) { 
       // TODO Auto-generated method stub 

      } 
     }, 0, str.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 

quindi aggiungere str al vostro TextView.

È inoltre necessario chiamare setMovementMethod(LinkMovementMethod.getInstance()); sul tuo TextView

3

Grazie a @ user370305 per la risposta .. Comunque ha mancato qualche frammento di codice nella sua risposta .. Per il bene degli altri, sto incollando l'intero codice che ha funzionato per me,

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     TextView someTextView = (TextView)findViewById(R.id.someTextView); 

     String content = "Hello this a test.. For more details contact"; 
     someTextView.setText(content); 

     SpannableString link = makeLinkSpan("@Peter", new View.OnClickListener() {   
       @Override 
       public void onClick(View v) { 
        //Do something here.. 
       } 
      }); 
      someTextView.append(link); 
     } 
     makeLinksFocusable(someTextView); 
    } 

    private void makeLinksFocusable(TextView tv) { 
     MovementMethod m = tv.getMovementMethod(); 
     if ((m == null) || !(m instanceof LinkMovementMethod)) { 
      if (tv.getLinksClickable()) { 
       tv.setMovementMethod(LinkMovementMethod.getInstance()); 
      } 
     } 
    } 

    private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener)     { 
     SpannableString link = new SpannableString(text); 
     link.setSpan(new ClickableString(listener), 0, text.length(), 
      SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); 
     return link; 
    } 

    private static class ClickableString extends ClickableSpan { 
     private View.OnClickListener mListener;   
     public ClickableString(View.OnClickListener listener) {    
      mListener = listener; 
     }   
     @Override 
     public void onClick(View v) { 
      mListener.onClick(v); 
     }   
    }