1

I have some hash tags in a TextView which are starts with '#'

Example:"#one#two Hello World #three".

I wants these hash tags clickable separately and open an activity and getting this text in that activity.

So these hash are working as a link and open up an activity. Also the tags are not fixed means that may be any text. Also change the color of hash tags to red and color of rest of tags will be black

Example: #one#two Hello World #three

Raghunandan
  • 132,755
  • 26
  • 225
  • 256
user1041858
  • 947
  • 2
  • 15
  • 32

2 Answers2

7

Modify the below according to your requirement. Use a SpannableString

String s ="#one #Two Hello World #three";
String split[] = s.split("#");
TextView_tv = (TextView) findViewById( R.id.tv );
for(int i=1;i<split.length;i++)
{
  SpannableString ss1=  new SpannableString("#"+split[i]);     
  ss1.setSpan(new  MyClickableSpan(""+i), 0, 1,  Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  ss1.setSpan(newForegroundColorSpan(Color.RED),0,1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  _tv.append(ss1);
   _tv.append(" ");   
}
_tv.setMovementMethod(LinkMovementMethod.getInstance());

class MyClickableSpan extends ClickableSpan{    
String clicked;
public MyClickableSpan(String string) {

    super();
    clicked =string;
    }

    public void onClick(View tv) {
        if(clicked.equals("1"))
        {
             Toast.makeText(getApplicationContext(), "One",1000).show();
        }
        else if(clicked.equals("2"))
        {
            Toast.makeText(getApplicationContext(), "Two",1000).show();
        }
        else
        {
            Toast.makeText(getApplicationContext(), "Three",1000).show();       
        }

   }

    @Override
    public void updateDrawState(TextPaint ds) {
       ds.setUnderlineText(false); // set to false to remove underline
    }
    } 
   }

Snap on Emulator

On each hash click displays toast one, two and three. Instead of toast start a new activity.

enter image description here

Edit:

If you want the string clicked

 ss1.setSpan(new  MyClickableSpan(""+i,split[i]), 0, 1,  Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Then

 String clicked;
 String astring;
 public MyClickableSpan(String check,String actualstring) {
super();
clicked =check;
astring =actualstring; // pass this to next activity using intent
}

Then

  public void onClick(View tv) {
        if(clicked.equals("1"))
        {
             Toast.makeText(getApplicationContext(), astring,1000).show();
        }
        else if(clicked.equals("2"))
        {
            Toast.makeText(getApplicationContext(), astring,1000).show();
        }
        else
        {
            Toast.makeText(getApplicationContext(), astring,1000).show();       
        }

   }
Raghunandan
  • 132,755
  • 26
  • 225
  • 256
0

You can use LinearLayout :

  • In xml add :

    <EditText
        android:id="@+id/tag_ET"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="4"
        android:gravity="left"
        android:inputType="text" />
    
    <Button
        android:id="@+id/add_Btn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_weight="1"
        android:text="@string/tags_add_btn_text" />
    

    <LinearLayout
        android:id="@+id/tags_view"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:orientation="horizontal" />
    

  • Init layout :

    // EditText to write Tags.
    EditText tag = (EditText) findViewById(R.id.tag_ET));
    // Button used to add tags
    Button addTagBtn = (Button) findViewById(R.id.add_Btn));
    // layout contains added tags.
    final LinearLayout tagsView = (LinearLayout) findViewById(R.id.tags_view);
    
  • Add tags to tagView :

        final String tagTxt = tagEt.getText().toString();
        if (!tagTxt.isEmpty()) {
            Spannable buttonLabel = new SpannableString(tagTxt);
    
            // clear tag edit text
            tagEt.setText("");
    
            // add tag to layout
            Button btn = new Button(this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            lout.addView(btn, tagsView);
    
            btn.setText(buttonLabel);
            btn.setBackgroundResource(R.drawable.hover);
            btn.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // Toast whatever you want.
                    Toast.makeText(getApplicationContext(), tagTxt,1000).show();
                }
            });
        }
    
Khaled Lela
  • 7,831
  • 6
  • 45
  • 73