Skip to content

Instantly share code, notes, and snippets.

@parthdave93
Created April 26, 2017 06:41
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save parthdave93/e9be2a0b20fcb91a52b7cd5fb5855f8f to your computer and use it in GitHub Desktop.
Save parthdave93/e9be2a0b20fcb91a52b7cd5fb5855f8f to your computer and use it in GitHub Desktop.
Single TextView Multi Clickable Span using binding adapter
<string-array name="termsandprivacyclicks">
<item>@string/terms_conditions</item>
<item>@string/privacy</item>
</string-array>
<string name="terms_conditions">Terms &amp; Conditions</string>
<string name="privacy">Privacy Policy</string>
<string name="accepting_terms_conditions_and_privacy">Accepting Terms &amp; Conditions and Privacy Policy</string>
@BindingAdapter(value = {"bind:textContentClickable", "bind:textContentClick"}, requireAll = true)
public static void onContentClick(TextView textView, String[] content, final View.OnClickListener clickListener) {
String originalText = textView.getText().toString();
SpannableString ss = new SpannableString(originalText);
for (int index = 0; index < content.length; index++) {
int indexStarting = originalText.indexOf(content[index]);
int lastIndex = indexStarting + content[index].length();
ss = applyClickToTextContent(ss, content[index], indexStarting, lastIndex, clickListener);
}
textView.setText(ss);
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
public static SpannableString applyClickToTextContent(SpannableString ss, String content, int contentStart, int contentEnd, final View.OnClickListener onClickListener) {
ss.setSpan(new MyClickableSpan(content, onClickListener), contentStart, contentEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new StyleSpan(Typeface.BOLD), contentStart, contentEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return ss;
}
import android.graphics.Color;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.view.View;
class MyClickableSpan extends ClickableSpan {
View.OnClickListener clickListener;
String content;
public MyClickableSpan(String content, View.OnClickListener clickListener) {
super();
this.content = content;
this.clickListener= clickListener;
}
public void onClick(View tv) {
tv.setTag(content);
clickListener.onClick(tv);
}
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.parseColor("#689899"));
ds.setUnderlineText(true); // set to false to remove underline
}
}
public class YourActivity extends BaseActivity implements View.OnClickListener {
ActivityYourActivityBinding binding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.youtlayout);
binding.setTermsAndConditionClick(this);
initTitle(getString(R.string.register));
}
@Override
public void onClick(View view) {
if(view==null){
return;
}
if(view.getTag()!=null){
if(view.getTag().toString()!=null){
String content = view.getTag().toString();
//clicking contents like tems and condition or privacy policy
if(content.equals(getString(R.string.terms_conditions))){
onTermsAndConditionsClick();
}
else if(content.equals(getString(R.string.privacy))){
onPrivacyPolicyClick();
}
}
}
}
public void onTermsAndConditionsClick(){
Toast.makeText(this,getString(R.string.terms_conditions),Toast.LENGTH_SHORT).show();
}
public void onPrivacyPolicyClick(){
Toast.makeText(this,getString(R.string.privacy),Toast.LENGTH_SHORT).show();
}
}
<layout>
<data>
<variable
name="termsAndConditionClick"
type="android.view.View.OnClickListener"/>
</data>
<LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:padding="@dimen/_10sdp"
android:text="@string/accepting_terms_conditions_and_privacy"
android:textColor="@color/text_grey"
android:textSize="@dimen/text_14"
bind:textContentClick="@{termsAndConditionClick}"
bind:textContentClickable="@{@stringArray/termsandprivacyclicks}"/>
</LinearLayout>
</layout>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment