Yeu*_*ung 11 html android textview
我有一个TextViewwith ClickableSpan,layout_height和layout_width都是wrap_content.
当文字在TextView不太长时,它工作正常.当文本足够长以使它需要2行时,它也可以正常工作但有一些奇怪的行为.
那是当我点击第二行的空白区域(不填充文本但是部分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());
Run Code Online (Sandbox Code Playgroud)
TextViewOnTouchListener:
class TextViewOnTouchListener implements OnTouchListener{
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("TextView", "onTouch");
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
TestClickableSpan:
class TestClickableSpan extends ClickableSpan{
@Override
public void onClick(View arg0) {
Log.d("ClickableSpan", "Confirm OnClick: "+arg0.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
dor*_*506 15
我设法通过扩展LinkMovementMethod来解决它,并检查触摸事件偏移是否等于或大于文本长度:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
感谢@dor506的回答,但它不适用于重力center,我做了一些修改。
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP) {
int x = (int) event.getX();
int y = (int) event.getY();
y -= widget.getTotalPaddingTop();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
float lineLeft = layout.getLineLeft(line);
float lineRight = layout.getLineRight(line);
if (x > lineRight || (x >= 0 && x < lineLeft)) {
return true;
}
}
return super.onTouchEvent(widget, buffer, event);
}
Run Code Online (Sandbox Code Playgroud)