2015-12-31 12 views
9

Sto tentando di riconoscere gli hashtag nel mio TextView e renderli selezionabili in modo tale da portare l'utente a un'altra vista quando fa clic sull'Hashtag.Android: impostazione di onClickListener su una parte di testo in TextView - Numero

Sono riuscito a identificare gli hashtag nella TextView usando Pattern Matching e appaiono colorati in runtime. Tuttavia, ho bisogno di rendere selezionabile l'hashtag.

Ecco il mio codice:

SpannableString hashText = new SpannableString("I just watched #StarWars and it was incredible. It's a #MustWatch #StarWars"); 
Matcher matcher = Pattern.compile("#([A-Za-z0-9_-]+)").matcher(hashText); 

while (matcher.find()) 
{ 
      hashText.setSpan(new ForegroundColorSpan(Color.parseColor("#000763")), matcher.start(), matcher.end(), 0); 
      String tag = matcher.group(0); 
} 

holder.caption.setText(hashText); 

//I need to set an OnClick listener to all the Hashtags recognised 

Usando la stessa soluzione di cui sopra, come posso aggiungere ascoltatori onclick ad ogni hashtag?

+0

ci sono biblioteche là fuori per fare lo stesso, controlla questo: https://github.com/Danylo2006/HashTagHelper –

+0

@SachinRao Sembra che la libreria non sia disponibile per il minimo sdk 9 :( – Dinuka

+0

prova ad incollare i 2 file java in qualsiasi del tuo pacco(HashTagHelper e ClickableForegroundColorSpan) –

risposta

8

c'è un modo ... dopo aver visto la tua domanda mi è stato appena googling .. e ho trovato questo, spero che funzionerà ...

1. è possibile utilizzare android.text.style.ClickableSpanlink

SpannableString ss = new SpannableString("Hello World"); 
    ClickableSpan span1 = new ClickableSpan() { 
     @Override 
     public void onClick(View textView) { 
      // do some thing 
     } 
    }; 

    ClickableSpan span2 = new ClickableSpan() { 
     @Override 
     public void onClick(View textView) { 
      // do another thing 
     } 
    }; 

    ss.setSpan(span1, 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    ss.setSpan(span2, 6, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

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

un altro modo .. link

TextView myTextView = new TextView(this); 
    String myString = "Some text [clickable]"; 
    int i1 = myString.indexOf("["); 
    int i2 = myString.indexOf("]"); 
    myTextView.setMovementMethod(LinkMovementMethod.getInstance()); 
    myTextView.setText(myString, BufferType.SPANNABLE); 
    Spannable mySpannable = (Spannable)myTextView.getText(); 
    ClickableSpan myClickableSpan = new ClickableSpan() 
    { 
    @Override 
    public void onClick(View widget) { /* do something */ } 
    }; 
    mySpannable.setSpan(myClickableSpan, i1, i2 + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

risposta appena copiato da quelli link ...

7

Sì, è possibile farlo, è necessario utilizzare ClickableSpan con SpannableString

incolla questo codice dentro il ciclo while

final String tag = matcher.group(0); 
ClickableSpan clickableSpan = new ClickableSpan() { 
       @Override 
       public void onClick(View textView) { 
        Log.e("click","click " + tag); 
       } 
       @Override 
       public void updateDrawState(TextPaint ds) { 
        super.updateDrawState(ds); 

       } 
      }; 
      hashText.setSpan(clickableSpan, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

Non dimenticate di impostare setMovementMethod() sul tuo TextView

holder.caption.setMovementMethod(LinkMovementMethod.getInstance()); 
2

È possibile utilizzare android.text.style.ClickableSpan per questo: Fare riferimento answer

3

È possibile modificare il colore con cliccabile un tasto (@, #) il testo da TextView usando questo code.I utilizzare quest'opera formate.It bene nel mio fianco.

private void setTags(TextView pTextView, String pTagString) { 
    SpannableString string = new SpannableString(pTagString); 

    int start = -1; 

    for (int i = 0; i < pTagString.length(); i++) { 
     if (pTagString.charAt(i) == '@' || pTagString.charAt(i) == '#') {    
      start = i; 

     } else if (pTagString.charAt(i) == ' ' 
       || (i == pTagString.length() - 1 && start != -1)) { 
      if (start != -1) { 
       if (i == pTagString.length() - 1) { 
        i++; // case for if hash is last word and there is no 
          // space after word 
       } 

       final String tag = pTagString.substring(start, i);    
       string.setSpan(new ClickableSpan() { 

        @Override 
        public void onClick(View widget) { 

         Toast.makeText(mContext, "" + tag, 3000) 
           .show(); 
        } 
        @Override 
        public void updateDrawState(TextPaint ds) { 

         if (tag.contains("@")) 
          ds.setColor(Color.parseColor("#0474be")); 
         else 
          ds.setColor(Color.parseColor("#ed6057")); 

         ds.setUnderlineText(false); 
        } 
       }, start, i, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       start = -1; 
      } 
     } 
    } 

    pTextView.setMovementMethod(LinkMovementMethod.getInstance()); 
    pTextView.setText(string); 
} 

Si prega di provare in questo modo spero che tu possa risolvere il tuo problema.

1

si può raggiungere utilizzando la funzione split e popolare textview's in un Layout come questo:

layout=(LinearLayout)findViewById(R.id.layout); 
String data="I just watched #StarWars and it was incredible. It's a #MustWatch #StarWars"; 
TextView textView; 
    String [] s=data.split(" "); 
    for(int i=0;i<s.length;i++){ 
     if(s[i].matches("#([A-Za-z0-9_-]+)")){ 

       textView=new TextView(this); 
       textView.setText(s[i]); 
       textView.setTextColor(Color.parseColor("#000763")); 
       textView.setTag(s[i]); 
       textView.setOnClickListener(viewClicked(textView)); 
     }else{ 
      textView=new TextView(this); 
       textView.setText(" "+s[i]); 
     } 
     layout.addView(textView,i); 
    } 

e un metodo per gestire cliccare evento richiesto Textview's:

View.OnClickListener viewClicked(final TextView textView) { 
    return new View.OnClickListener() { 
     public void onClick(View v) { 
      Toast.makeText(getApplicationContext(), v.getTag().toString(), 1000).show(); 

     } 
    }; 
} 
2

// Got Ma Senza Pattern Match

SpannableString hashText = new SpannableString("I just watched #StarWars and it was incredible. It's a #MustWatch #StarWars"); 



    ClickableSpan clickableSpanstar1stWarsHashText = new ClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      //Intent starWars = new Intent(MainActivity.this,starWars.class); //starWars is a class file which extends Activity 
      //startActivity(starWars); 
      Toast.makeText(MainActivity.this,"Clicked On 1st #StarWars Remove comments of above line",Toast.LENGTH_LONG).show(); 
     } 
    }; 

    ClickableSpan clickableSpanmustWatchHashText = new ClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      //Intent mustWatch = new Intent(MainActivity.this,mustWatch.class); //starWars is a class file which extends Activity 
      //startActivity(mustWatch); 
      Toast.makeText(MainActivity.this,"Clicked On #MustWatch Remove comments of above line",Toast.LENGTH_LONG).show(); 
     } 
    }; 

    ClickableSpan clickableSpanstar2ndWarsHashText = new ClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      //Intent starWars = new Intent(MainActivity.this,starWars.class); //starWars is a class file which extends Activity 
      //startActivity(starWars); 
      Toast.makeText(MainActivity.this,"Clicked On 2nd #StarWars Remove comments of above line",Toast.LENGTH_LONG).show(); 
     } 
    }; 

    hashText.setSpan(clickableSpanstar1stWarsHashText,15,24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    hashText.setSpan(clickableSpanmustWatchHashText, 55, 65, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    hashText.setSpan(clickableSpanstar2ndWarsHashText,66,75, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 




    //SpannableString hashText = new SpannableString("I just watched #StarWars and it was incredible. It's a #MustWatch #StarWars"); 

    TextView textView = (TextView) findViewById(R.id.textView); //textView id i.e. android:id="@+id/textView" 
    textView.setText(hashText); 
    textView.setMovementMethod(LinkMovementMethod.getInstance()); 
    textView.setHighlightColor(Color.TRANSPARENT); 
+0

Funziona bene come il tuo bisogno – Abhishek

Problemi correlati