2012-02-14 23 views
8

Tôi có một TextView với ClickableSpan trong đó cả layout_height và layout_width là wrap_content.ClickableSpan hành vi lạ: onClick() được gọi khi nhấp vào khoảng trống

Khi văn bản trong TextView không quá dài, nó hoạt động tốt. Khi văn bản đủ dài để nó có 2 dòng, nó cũng hoạt động tốt nhưng có một số hành vi lạ.

Đó là khi tôi nhấp vào không gian trống của dòng thứ hai (không điền văn bản nhưng là một phần của TextView), gọi lại số ClickableSpanonClick().

Tôi không mong đợi điều này khi tôi chỉ nhấp vào không gian trống mà không phải văn bản được kéo dài. Mặc dù nó không ảnh hưởng nhiều, tôi muốn biết những gì đằng sau.

tôi đặt ClickableSpan với mã bên dưới:

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()); 

Các TextViewOnTouchListener:

class TextViewOnTouchListener implements OnTouchListener{ 

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

Các TestClickableSpan:

class TestClickableSpan extends ClickableSpan{ 

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

Bạn đã giải quyết vấn đề này chưa? –

+0

@KiranKumar xem câu trả lời của tôi bên dưới – dor506

Trả lời

9

tôi quản lý để giải quyết nó bằng cách mở rộng LinkMovementMethod, và kiểm tra cho dù sự kiện cảm ứng của fset bằng hoặc lớn hơn độ dài văn bản:

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); 
    } 
} 
+3

Điều này thật tuyệt vời, cảm ơn! Một điều cần lưu ý cho điều đó là tôi cũng sẽ cần ghi đè hàm getInstance() tĩnh, nếu không bạn sẽ vẫn được trả về một thể hiện của lớp LinkMovementMethod cơ bản. Tôi đã mất một thời gian cố gắng tìm ra điều đó để hy vọng tôi có thể cứu được một số người khác. – martinp

+2

@ dor506 Tôi yêu bạn! Cảm ơn bạn rất nhiều. – Dogcat

+0

@martinp cảm ơn người đàn ông, tôi cũng mất thời gian ở đó. OnTouchEvent của LinkMovementMethod vẫn được gọi và khiến tôi bối rối. – Mallika