user1041858
user1041858

Reputation: 957

Create clickable link in text view in android

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

Upvotes: 1

Views: 1760

Answers (2)

Khaled Lela
Khaled Lela

Reputation: 8119

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

Upvotes: 0

Raghunandan
Raghunandan

Reputation: 133560

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

   }

Upvotes: 7

Related Questions