2015-12-31 3 views
9

Я пытаюсь распознать хэштеги в своем TextView и сделать их интерактивными, чтобы я мог взять пользователя в другой вид, когда они нажимают на Hashtag.Android: установка onClickListener на часть текста в TextView - проблема

Мне удалось идентифицировать Hashtags в TextView, используя Match Matching, и они отображаются в Runtime. Тем не менее, мне нужно сделать Hashtag доступным.

Вот мой код:

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 

Используя тот же раствор выше, как я могу добавить OnClick слушателей к каждому хэштегом?

+0

есть библиотеки, чтобы сделать то же самое, проверьте это: https://github.com/Danylo2006/HashTagHelper –

+0

@SachinRao Похоже, что эта библиотека недоступна для минимального sdk 9 :( – Dinuka

+0

попробуйте вставить два java-файла в любой вашего пакета.(HashTagHelper и ClickableForegroundColorSpan) –

ответ

8

есть способ ... после просмотра на ваш вопрос я просто погуглить .. и я нашел, что это, я надеюсь, что он будет работать ...

1. вы можете использовать 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()); 

другой способ .. 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); 

ответ просто скопировал из этой ссылки ...

7

Да, вы можете сделать это, вам нужно использовать ClickableSpan с SpannableString

вставить этот код внутри время цикла

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

Не забудьте установить setMovementMethod() на ваш TextView

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

Вы можете использовать android.text.style.ClickableSpan для этого: См answer

3

Вы можете изменить цвет с интерактивной любой клавишей (@, #) текст из TextView с помощью этого code.I использовать этот formate.It работу хорошо в моей стороне.

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

Пожалуйста, попробуйте этот путь, надеясь, что вы сможете решить вашу проблему.

1

Вы можете достичь его с помощью split функции и заполнения textview's в Layout, как это:

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

и метод для обработки нажмите событие для требуемого 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 Но Без соответствия шаблону

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

Это работает отлично, как ваша потребность – Abhishek

Смежные вопросы