2016-04-04 4 views
2

У меня есть EditText и TextWatcher, в котором я проверяю шаблоны, чтобы определить, где создавать ClickableSpans.ClickableSpan в EditText до конца текстовых вызовов click() в конец строки

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

Это мой собственный класс Span.

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

Проблема заключается в том, когда я заканчиваю свой текст с пролетом и нет знаков после него, и я нажимаю после него, он по-прежнему считается одним щелчком, чтобы охватывать и OnClick называется. Из-за этого я не могу поместить курсор сразу после прокрутки, чтобы продолжить редактирование. Но если я напечатаю любой символ, даже пробел после пролета, я могу легко поместить курсор после пролета, и все будет хорошо. Есть ли способ исправить клики в edittext после кликабельного диапазона, если нет символов за пределами?

+1

У меня была схожая проблема, и это [это] (http://stackoverflow.com/a/24995777) помогает мне. –

+0

Возможный дубликат [ClickwiseSpan странное поведение: onClick() вызывается при нажатии пустого пространства] (https://stackoverflow.com/questions/9274331/clickablespan-strange-behavioronclick-called-when-clicking-empty-space) – bummi

ответ

1

Я нашел решение моей проблемы в dor506s ответить here. Но были некоторые проблемы с многострочным текстом с пролетами, так что я сделал некоторые твики:

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

Может быть, не самым красивым многострочным решение, но он работал на меня.