ClickableSpan奇怪的行为:点击空白时调用onClick() [英] ClickableSpan strange behavior:onClick() called when clicking empty space

查看:747
本文介绍了ClickableSpan奇怪的行为:点击空白时调用onClick()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 TextView ClickableSpan ,因为layout_height和layout_width都是wrap_content。



TextView 中的文本不太长时,它可以正常工作。
当文本足够长以至于需要2行时,它也可以正常工作,但有一些奇怪的行为。



那是当我点击第二行line的空白空间(未填充文本但是 TextView的一部分), ClickableSpan onClick ()回调被调用。



我不指望这是因为我只点击了空白空间,而没有点击空白文本。
虽然它并没有太大影响,但我想知道背后是什么。



我设置了 ClickableSpan 以下代码:

  TextView tv =(TextView)findViewById(R.id.text); 
tv.setText(TEXT TEXT TEXT TEXT);
SpannableStringBuilder ssb = new SpannableStringBuilder();
ssb.append(tv.getText());
ssb.setSpan(new TestClickableSpan(),ssb.length() - 5,ssb.length(),0);
tv.setText(ssb);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setOnTouchListener(new TextViewOnTouchListener()); b


$ b

class TextViewOnTouchListener实现OnTouchListener {
$ b $ @覆盖
public boolean onTouch(View v,MotionEvent event){
Log.d(TextView,onTouch );
返回false;
}
}

TestClickableSpan:

  class TestClickableSpan extends ClickableSpan {
$ b @Override
public void onClick(View arg0){
Log.d (ClickableSpan,确认OnClick:+ arg0.toString());
}
}


解决方案

I设法通过扩展LinkMovementMethod来解决它,并检查触摸事件
offset是否等于或大于文本长度:

  public class MovementMethod extends LinkMovementMethod {
$ b $ @Override
public boolean onTouchEvent(TextView小部件,Spannable缓冲区,MotionEvent事件){
int action = event.getAction();

if(action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN){
int x =(int)event.getX();
int y =(int)event.getY();

x - = widget.getTotalPaddingLeft();
y - = widget.getTotalPaddingTop();

x + = widget.getScrollX();
y + = widget.getScrollY();

布局布局= widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizo​​ntal(line,x);

if(off> = widget.getText()。length()){
//返回true,所以点击不会在剩余的空白区域被触发
return真正;
}
}

返回super.onTouchEvent(widget,buffer,event);
}
}


I have a TextView with ClickableSpan in that both layout_height and layout_width is wrap_content.

When the text in TextView in not too long, it work fine. When the text is long enough such that it take 2 line, it also work fine but have some strange behavior.

That is when I clicked on the second line's empty space(not fill with text yet but part of TextView) , the ClickableSpan onClick() callback is called.

I do not expect this as I clicked the empty space only but not the spanned text. Although it does not affect much, I want to know what is behind.

I set the ClickableSpan with below code:

TextView tv = (TextView) findViewById(R.id.text);
tv.setText("TEXT TEXT TEXT TEXT");
SpannableStringBuilder ssb = new SpannableStringBuilder();
ssb.append(tv.getText());
ssb.setSpan(new TestClickableSpan(), ssb.length()-5, ssb.length(), 0);
tv.setText(ssb);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setOnTouchListener(new TextViewOnTouchListener());

The TextViewOnTouchListener:

class TextViewOnTouchListener implements OnTouchListener{

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.d("TextView", "onTouch");
            return false;
        }       
}

The TestClickableSpan:

class TestClickableSpan extends ClickableSpan{

        @Override
        public void onClick(View arg0) {
            Log.d("ClickableSpan", "Confirm OnClick: "+arg0.toString());
        }       
    }

解决方案

I managed to solve it by extending LinkMovementMethod, and check whether the touch event offset is equals or bigger than the text lenght:

public class MovementMethod extends LinkMovementMethod {

    @Override
    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
        int action = event.getAction();

        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
            int x = (int) event.getX();
            int y = (int) event.getY();

            x -= widget.getTotalPaddingLeft();
            y -= widget.getTotalPaddingTop();

            x += widget.getScrollX();
            y += widget.getScrollY();

            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);

            if (off >= widget.getText().length()) {
               // Return true so click won't be triggered in the leftover empty space
                return true;
            }
        }

        return super.onTouchEvent(widget, buffer, event);
    }
}

这篇关于ClickableSpan奇怪的行为:点击空白时调用onClick()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆