Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - Hashtag in TextView

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);
    }
}
like image 980
Nurdin Avatar asked May 06 '15 09:05

Nurdin


3 Answers

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);
...
like image 76
pRaNaY Avatar answered Oct 12 '22 23:10

pRaNaY


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

like image 21
Muyide Ibukun Avatar answered Oct 12 '22 23:10

Muyide Ibukun


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);
like image 24
Danylo Volokh Avatar answered Oct 12 '22 23:10

Danylo Volokh