Android篇textview中片段响应点击事件(SpannableString)

本文介绍了一种在Android中实现自定义TextView点击效果的方法,通过创建TouchableSpan类,可以为TextView内的特定文本设置点击响应及视觉反馈,避免系统默认URL处理机制的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目需求

 

点击textView中的一小段文字,弹一个dialog框

 

失败解决方案

 

刚开始是用了两个textView水平布局,可想而知,当第一个textView快占满一行,还未换行时,第二个textView很可能出现换行排版问题

 

用spannableString的问题

 

小段文字有下划线

点击textView中的小段文字时,系统会当做url处理,给点击部分的text加一个蓝色的背景

 

解决方案


public class TouchableSpan extends ClickableSpan {
	    private boolean mIsPressed;
	    private int mPressedBackgroundColor;
	    private int mNormalTextColor;
	    private int mPressedTextColor;

	    public TouchableSpan(int normalTextColor, int pressedTextColor, int pressedBackgroundColor) {
	        mNormalTextColor = normalTextColor;
	        mPressedTextColor = pressedTextColor;
	        mPressedBackgroundColor = pressedBackgroundColor;
	    }

	    public void setPressed(boolean isSelected) {
	        mIsPressed = isSelected;
	    }

	    @Override
	    public void updateDrawState(TextPaint ds) {
	        super.updateDrawState(ds);
	        ds.setColor(mIsPressed ? mPressedTextColor : mNormalTextColor);
	        ds.bgColor = mIsPressed ? mPressedBackgroundColor : 0x00eeeeee;
	        ds.setUnderlineText(false);
	    }

		@Override
		public void onClick(View widget) {
			//todo
		}
	}

public class TouchableSpan extends ClickableSpan {
	    private boolean mIsPressed;
	    private int mPressedBackgroundColor;
	    private int mNormalTextColor;
	    private int mPressedTextColor;

	    public TouchableSpan(int normalTextColor, int pressedTextColor, int pressedBackgroundColor) {
	        mNormalTextColor = normalTextColor;
	        mPressedTextColor = pressedTextColor;
	        mPressedBackgroundColor = pressedBackgroundColor;
	    }

	    public void setPressed(boolean isSelected) {
	        mIsPressed = isSelected;
	    }

	    @Override
	    public void updateDrawState(TextPaint ds) {
	        super.updateDrawState(ds);
	        ds.setColor(mIsPressed ? mPressedTextColor : mNormalTextColor);
	        ds.bgColor = mIsPressed ? mPressedBackgroundColor : 0x00eeeeee;
	        ds.setUnderlineText(false);
	    }

		@Override
		public void onClick(View widget) {
			//todo
		}
	}


用法:

TextView tView = (TextView) findViewById(R.id.text);
String sss = "BubyBBBAAAAAAAAAAAAAAAAAA";
SpannableString spanName = new SpannableString(sss);
TouchableSpan touchableSpan1 = new TouchableSpan(Color.argb(255, 82, 107, 146), Color.argb(255, 82, 107, 146), Color.argb(90, 0, 0, 0));
touchableSpan1.setPressString(sss.substring(0, 7));
touchableSpan1.setPressed(true);
spanName.setSpan(touchableSpan1, 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

tView.setText(spanName, BufferType.SPANNABLE);
tView.setMovementMethod(new LinkTouchMovementMethod());


转载来自:http://www.it165.net/pro/html/201406/15582.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值