2016-04-04 17 views
2

Ben bir ClickText ve ben ClickableSpans oluşturmak için desenleri kontrol etmek için desenler kontrol ettiğim TextWatcher var.EditText içinde metin aramalarının sonuna tıklayın ClickableSpan satır sonuna sonuna() tıklamak

private void checkSpans(){ 
    Matcher matcher = Pattern.compile("(^|[ \\t\\n])#\\w+").matcher(text); 
    while (matcher.find()) { 
     BlueClickableSpan[] spans = getText().getSpans(matcher.start(), matcher.end(), BlueClickableSpan.class); 
     for (BlueClickableSpan span : spans) { 
      text.removeSpan(span); 
     } 
     text.setSpan(new BlueClickableSpan(), 
       matcher.start(), 
       matcher.end(), 
       Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    } 
} 

İşte özel Span sınıfım. Bir yayılma ile benim metin bitirmek ve kendinden sonra başka karakter var ve onu, hala span bir tıklama olarak sayar ve onClick denir SONRA ben dokunduğunuzda

private class BlueClickableSpan extends ClickableSpan { 

     @Override 
     public void onClick(View view) { 
      Spanned s = getText(); 
      int start = s.getSpanStart(this); 
      int end = s.getSpanEnd(this); 
      String clickedString = s.subSequence(start, end).toString().trim(); 
      if (onSpanClick != null) 
       onSpanClick.onClick(clickedString); 
     } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      ds.setColor(ContextCompat.getColor(IdeaFlowApp.getAppContext(), R.color.main_blue)); 
     } 
    } 

sorundur. Bu nedenle, düzenlemeye devam etmek için yayından sonra imleci hemen yerleştiremiyorum. Ancak, herhangi bir sembol basarsam, hatta boşluktan sonra bile boşluk yazarsam, imleci yayından sonra kolayca yerleştirebilirim ve her şey iyi çalışıyor. Herhangi bir sembol yoksa, tıklanabilir yayından sonra edittext tıklamaları düzeltmenin bir yolu var mı?

+1

Benzer bir sorun yaşadım ve bu [http://stackoverflow.com/a/24995777] bana yardımcı oluyor. –

+0

[Boş alan tıklandığında çağrılan] [ClickableSpan garip davranış: onClick()] 'nin olası kopyası] (https://stackoverflow.com/questions/9274331/clickablespan-strange-behavioronclick-called-when-clicking-empty-space) – bummi

cevap

1

dor506s numaralı yanıtı here numaralı telefon numarasındaki sorunuma bir çözüm buldum. Ama açıklıklı çok hatlı metin ile bazı sorunlar vardı, bu yüzden yapılan bazı ince ayarlar:

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 = getLayout(); 
      int line = layout.getLineForVertical(y); 
      int off = layout.getOffsetForHorizontal(line, x); 

      int lineLength = line; 
      String[] lines = getText().toString().split("\n"); 
      for (int i = 0; i <= line; i++) { 
       lineLength += lines[i].length(); 
      } 

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

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

Belki en güzel çok hatlı çözüm, ama benim için çalıştı.

İlgili konular