8

Is it possible to add onclick to some portion of a textview? For instance my code goes like this,

String content = "Hello this a test.. For more details contact @Peter";
someTextView.setText(content);

I would like to add an onClick event for "@Peter". Is that possible?

TIA.

Naveen
  • 1,040
  • 4
  • 15
  • 38

5 Answers5

7

Simple: -)

SpannableString link = makeLinkSpan("@Peter", new View.OnClickListener() {          
        @Override
        public void onClick(View v) {
            // Peforme Click
        }
    });
String content = "Hello this a test.. For more details contact";
someTextView.setText(content);
someTextView.append(link);

And makeLinkSpan() method is

private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener) {
    SpannableString link = new SpannableString(text);
    link.setSpan(new ClickableString(listener), 0, text.length(), 
        SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
    return link;
}

ClickableString Class

private static class ClickableString extends ClickableSpan {  
    private View.OnClickListener mListener;          
    public ClickableString(View.OnClickListener listener) {              
        mListener = listener;  
    }          
    @Override  
    public void onClick(View v) {  
        mListener.onClick(v);  
    }        
}
user370305
  • 108,599
  • 23
  • 164
  • 151
  • Now, you have only Click event for "@Peter" text. Not for complete TextView. Means your word @Peter is linked.. – user370305 Jan 03 '13 at 08:30
5

Thanks to @user370305 for the response.. However he missed some code snippet in his answer.. For the benefit of others, I'm pasting the entire code that worked for me,

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView someTextView = (TextView)findViewById(R.id.someTextView);

        String content = "Hello this a test.. For more details contact";
        someTextView.setText(content);

        SpannableString link = makeLinkSpan("@Peter", new View.OnClickListener() {          
                @Override
                public void onClick(View v) {
                    //Do something here..
                }
            });
            someTextView.append(link); 
        }
        makeLinksFocusable(someTextView);
    }

    private void makeLinksFocusable(TextView tv) {
        MovementMethod m = tv.getMovementMethod();  
        if ((m == null) || !(m instanceof LinkMovementMethod)) {  
            if (tv.getLinksClickable()) {  
                tv.setMovementMethod(LinkMovementMethod.getInstance());  
            }  
        }  
    }

    private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener)                 {
        SpannableString link = new SpannableString(text);
        link.setSpan(new ClickableString(listener), 0, text.length(), 
            SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
        return link;
    }

    private static class ClickableString extends ClickableSpan {  
        private View.OnClickListener mListener;          
        public ClickableString(View.OnClickListener listener) {              
            mListener = listener;  
        }          
        @Override  
        public void onClick(View v) {  
            mListener.onClick(v);  
        }        
    }
Naveen
  • 1,040
  • 4
  • 15
  • 38
4

In you Xml add this,android:clickable="true"

in you activity use like this,

textView.setOnClickListener(new View.OnClickListener(){
    public void onClick(){

    }
}
Aerrow
  • 12,086
  • 10
  • 56
  • 90
  • 1
    This will add click event for the entire textview.. I would like to add it for only some portion.. in the case mentioned above for **@Peter** – Naveen Jan 03 '13 at 08:40
  • @Peter: Refer this link, i hope this may help you http://adilatwork.blogspot.in/2011/07/android-how-to-make-only-part-of.html – Aerrow Jan 03 '13 at 08:46
2

This is possible wither using Java code:

someTextView.setOnClickListener(new View.OnClickListener(){
    public void onClick(){
        //Do Stuff
    }
});

But first make sure that you set it clickable.

someTextView.setClickable(true);
Matt Clark
  • 27,671
  • 19
  • 68
  • 123
  • 2
    I would like to `onclick` for only some portion of the textview and not for the entire textview. – Naveen Jan 03 '13 at 08:40
1

Try this:

SpannableString str = new SpannableString("@Peter");
str.setSpan(new ClickableSpan() {

            @Override
            public void onClick(View widget) {
                // TODO Auto-generated method stub

            }
        }, 0, str.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

Then append str to your TextView.

You also need to call setMovementMethod(LinkMovementMethod.getInstance()); on your TextView

Thommy
  • 5,070
  • 2
  • 28
  • 51