2012-05-13 2 views
4

私はAndroidアプリにEditTextビューがあります。私はそれの中に "内部リンク"が必要で、これは私がいくつかのボタン(onClick)で私はいくつかのアクション(Webページにリダイレクトしない)を行うことができますEditTextとスパンを必要とすることを意味します。 私は正常に動作しますが、et.setMovementMethod()コピー&ペーストのアイテムを使用した後に無効にされている「内部リンク」ClickableSpan() アンドロイドのEditViewのクリック可能なリンクとコピー/ペーストのメニュー

このような
linkWord = "my link"; 
link = new SpannableString(linkWord); 
cs = new ClickableSpan(){ 
private String w = linkWord; 
    @Override 
    public void onClick(View widget) { 
    wrd.setText(w); 
    } 
}; 
link.setSpan(cs, 0, linkWord.length(), 0); 
et.append(link); 

で、このボタンを実現するために、私は

et.setMovementMethod(LinkMovementMethod.getInstance());

を使用し、このスパンクリッカブルを作りますOnLongClickメニュー。 EditTextに「リンク」が必要で、同時にこのビューからテキストをコピーするので、これは問題です。

私はリスナーOnLongClickListenerに一時的な無効化「リンク」機能のためのremoveMovementMethod()のようなものを設定して、コピー/ペーストをし、再びsetMovementMethod()法上のテキストスイッチを対処した後、メニューを使用するためのアイデアを持っています。しかし、私はこれを実現する方法を知らない。

私を助けることができますか?あなたは別の方法があるかもしれません...

ありがとう!

答えて

4

私はlongClickメニューのコピー/貼り付けがない。この場合には

et.setMovementMethod(LinkMovementMethod.getInstance()); 

を使用のEditText内部のクリック可能なリンクについては...

をこの問題を解決し、これが誰かのために興味深いものになるかもしれアイテム。 のために、私は私がそれを行うことができ、正常に戻っのEditText状態に必要なそれらを活性化:この方法のリンクは通常のlongClickメニューを動作しますが、表示されません後

et.setMovementMethod(ArrowKeyMovementMethod.getInstance()); 

そこで私は、コンテキストメニューに新しい項目を追加し、この2つのオプションの切り替え:

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    if(et.getSelectionStart() == -1){ // in case of setMovementMethod(LinkMovementMethod.getInstance()) 
     menu.add(0, 1, 0, "Enable copy"); 
    } 
    else{ 
     menu.add(0, 2, 0, "Enable links"); 
    } 
} 
@Override 
public boolean onContextItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case 1: 
      et.setMovementMethod(ArrowKeyMovementMethod.getInstance()); 
      et.setSelection(0, 0); 
       //re-register EditText for context menu: 
      unregisterForContextMenu(et); 
      registerForContextMenu(et); 
      break; 
     case 2: 
      et.setMovementMethod(LinkMovementMethod.getInstance()); 
      break; 
     } 
     return true; 
    } 

はまた、私は、コンテキストメニューのためのEditTextを登録:

registerForContextMenu(et); 

が、これは人を助けるという希望を持っています!

13

リンクモードとコピーモードの間でユーザーの切り替えが発生すると、ユーザービリティの賞が得られるとは思いません。私のソリューションでは、テキストを選択してリンクを同時に開くことができます。これを実現するには、単にテキストを選択できるArrowKeyMovementMethodを拡張し、リンクのクリック/タッチを処理するLinkMovementMethodからonTouchEvent()メソッドを追加します。 1行のコードを変更する必要があります。これは、画面に触れた座標にリンクが見つからない場合にTextViewから選択範囲を削除する行です。

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

} 

これはドキュメントは述べていてもかなり安全で行う:

ここでは、完全なクラスです

このインタフェースは、[MovementMethod]フレームワークが使用するためのものです。 アプリケーションによって直接実装されるべきではありません。 http://developer.android.com/reference/android/text/method/MovementMethod.html

は、上記のコードは、インターフェースを実装するのではなく、文書のクラスを拡張します。リンクがタップされたかどうかを確認するためのチェックを追加し、そうでない場合はスーパークラスのメソッドを使用します。

関連する問題