2012-01-21 42 views
3

EditTextウィジェットを使用してAndroidで一般的なリッチテキストエディタを作成しようとしています(テキストの書式設定、リンク、および画像のテキストへの挿入をサポートする必要があります)。 問題がハイパーリンクにクリックを取り扱い可能にするものですが、私はとウィジェットにLinkMovementMethodを割り当てる必要があります:LinkMovementMethodはEditTextで編集問題を引き起こします

textEditor.setMovementMethod(LinkMovementMethod.getInstance()); 

残念ながら、これはエディタが奇妙な動作を引き起こします。既存のテキストコンテンツを編集してテキストの途中で触れる場合、入力を開始すると、テキストは実際にはタッチポイントではなく既存のテキストの前に追加されます。 私がLinkMovementMethodを使用しないと、編集はうまくいきますが、この場合はリンクがクリックできなくなります。

ここでは何ができますか?誰もLinkMovementMethodクラスの修正版の良い例を知っていますか? ヒント?

+0

からsetMovementMethodsのすべての種類を削除します同じ問題があります。 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

関連する問題