How to implement hashtag inside TextView? What I want to do is implement linkable hashtag inside textview. Then user can click on it (hashtag) and switch to another fragment. This is my layout and fragment.
Layout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainFragment" >
<TextView
android:id="@+id/txtHashtag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Iena I #love you !!!"/>
</RelativeLayout>
Fragment
package com.xxxx;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.xxxxx.R;
public class MainFragment extends Fragment{
private TextView txtHashtag;
public MainFragment() {
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View v = LayoutInflater.from(getActivity()).inflate(R.layout.activity_main_fragment,
null);
txtHashtag = (TextView) v.findViewById(R.id.txtHashtag);
return v;
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
}
}
Try below code to match TextView text that start with #:
...
txtHashtag = (TextView) v.findViewById(R.id.txtHashtag);
//Pattern to find if there's a hash tag in the message
Pattern tagMatcher = Pattern.compile("[#]+[A-Za-z0-9-_]+\\b");
String url = "https://www.google.co.in/";
//Attach Linkify to TextView
Linkify.addLinks(txtHashtag, tagMatcher, url);
...
Use this, Clickable Span in TextView
// setting span
SpannableString tagSpan = new SpannableString("#clickMe");
ClickableSpan clickSpan = new ClickableSpan() {
@Override
public void onClick(View textView) {
//code to swtich to new fragment
}
@Override
public void updateDrawState(TextPaint paint) {
super.updateDrawState(paint);
paint.setUnderlineText(true); // set underline if you want to underline
paint.setColor(Color.BLUE); // set the color to blue
}
};
tagSpan.setSpan(clickSpan, startPosition, endPosition, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView txtHashtag = (TextView) findViewById(R.id.txtHashtag);
txtHashtag.setText(tagSpan);
txtHashtag.setMovementMethod(LinkMovementMethod.getInstance());
You can implement more than one span in a textView, so simply write a function to do that and call it for each #HashTag
You can use this simple library HashTagHelper
It has very simple usage:
mHashTagText = (TextView) findViewById(R.id.text);
mTextHashTagHelper = HashTagHelper.Creator.create(getResources().getColor(R.color.colorPrimary),
new HashTagHelper.OnHashTagClickListener() {
@Override
public void onHashTagClicked(String hashTag) {
}
});
// pass a TextView or any descendant of it (incliding EditText) here.
// Hash tags that are in the text will be hightlighed with a color passed to HasTagHelper
mTextHashTagHelper.handle(mHashTagText);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With