2012-02-14 183 views
8

我有一個TextViewClickableSpan因爲layout_height和layout_width都是wrap_content。ClickableSpan奇怪的行爲:點擊空白時調用onClick()

TextView中的文字不太長時,它工作正常。 當文本足夠長以至於需要2行時,它也可以正常工作,但有一些奇怪的行爲。

這就是當我點擊第二行的空白空間(未填充文本但是部分爲TextView)時,調用ClickableSpanonClick()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()); 

的TextViewOnTouchListener:

class TextViewOnTouchListener implements OnTouchListener{ 

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

的TestClickableSpan:

class TestClickableSpan extends ClickableSpan{ 

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

您是否解決了這個問題? – 2013-12-30 01:48:43

+0

@KiranKumar查看我的答案 – dor506 2014-07-28 12:58:13

回答

9

我管理通過延伸LinkMovementMethod來解決它,並檢查是否觸摸事件 fset等於或大於文本長度:

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

這太棒了,謝謝!有一點需要注意,因爲我需要重寫靜態getInstance()函數,否則您仍然會返回基礎LinkMovementMethod的實例。我失去了一些時間試圖弄清楚,所以希望我可以挽救別人一些頭痛。 – martinp 2015-07-23 23:54:36

+2

@ dor506我愛你!非常感謝。 – Dogcat 2016-08-19 09:59:02

+0

@馬蒂普感謝的人,我也在那裏失去了時間。 LinkMovementMethod的onTouchEvent不斷被調用,讓我感到困惑。 – Mallika 2016-10-04 09:40:04