2012-01-21 64 views
3

我想在Android中使用EditText小部件(應支持文本格式,鏈接和插入圖片在文本中)中創建一個一般的富文本編輯器。 的問題是,爲了能夠處理一些點擊超鏈接,我需要分配LinkMovementMethod到窗口小部件爲:LinkMovementMethod導致編輯問題在EditText

textEditor.setMovementMethod(LinkMovementMethod.getInstance()); 

不幸的是,這將導致出現異常的編輯器。如果我想編輯現有的文本內容,並且觸摸文本中間的某個位置,當我開始輸入文本時,實際上文本會在小部件的開頭添加到現有文本之前,而不是觸摸點。 如果我不使用LinkMovementMethod,編輯工作正常,但在這種情況下,我的鏈接不再可點擊。

我能在這裏做什麼?有沒有人知道LinkMovementMethod類的修改版本的一個很好的例子? 任何提示?

+0

我有同樣的問題。當我使用LinkMovementMethod時,我無法長時間從TextView中選擇文本。沒有任何操作欄或菜單通常沒有LinkMovementMethod。 – bancer

+0

嗨!你解決了這個問題嗎?我很有興趣回答。謝謝! – lubart

回答

0

嘗試: - 在你的項目中添加此類

import android.text.Layout; 
import android.text.Selection; 
import android.text.Spannable; 
import android.text.method.ArrowKeyMovementMethod; 
import android.text.method.MovementMethod; 
import android.text.style.ClickableSpan; 
import android.view.MotionEvent; 
import android.widget.TextView; 

/** 
* Created by Nishu on 20-08-2015. 
*/ 
public class MyMovementMethod extends ArrowKeyMovementMethod { 

private static MyMovementMethod sInstance; 

public static MovementMethod getInstance() { 
    if (sInstance == null) { 
     sInstance = new MyMovementMethod(); 
    } 
    return sInstance; 
} 

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

     ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); 

     if (link.length != 0) { 
      if (action == MotionEvent.ACTION_UP) { 
       link[0].onClick(widget); 
      } 
      else if (action == MotionEvent.ACTION_DOWN) { 
       Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); 
      } 

      return true; 
     } 
     /*else { 
      that's the line we need to remove 
      Selection.removeSelection(buffer); 
     }*/ 
    } 

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

} 

現在添加下面的代碼符合你的EditText

YourEditText.setMovementMethod(MyMovementMethod.getInstance()); 

和EDITTEXT

刪除所有類型setMovementMethods的