Reputation: 957
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
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
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.
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