2016-04-04 5 views
2

私はEditTextとTextWatcherを持っています。ここでパターンをチェックしてClickableSpansを作成する場所を決定します。EditTextのClickableSpanをテキスト呼び出しの最後にクリックします。

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

ここは私のカスタムスパンクラスです。私はスパンで私のテキストを終了し、それの後には文字がないと、それは、それはまだまたがるクリックとしてカウントし、onClickのが呼び出された後、私はタップしたとき

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

問題が、あります。そのため、編集を続けるためにスパンの直後にカーソルを置くことはできません。しかし、スパンの後に空白があってもシンボルを印字すれば、スパンの後ろにカーソルを置くことができ、すべて正常に動作します。クリック可能なスパンの後にedittextのクリックを修正する方法はありますか?

+1

私にも同様の問題がありましたが、[this](http://stackoverflow.com/a/24995777)は私を助けます。 –

+0

[ClickableSpanの奇妙な振る舞い:空のスペースをクリックしたときに呼び出されるonClick()](https://stackoverflow.com/questions/9274331/clickablespan-strange-behavioronclick-called-when-clicking-emptyspace) – 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); 
    } 
} 

多分ない最も美しいマルチラインのソリューションが、それは私のために働きました。

関連する問題