2013-02-13 21 views
22

私はTextViewを選択してリンクさせたいと思っています。両方を行うと、選択可能なテキストになりますが、リンクはクリックできません。リンクされて選択可能なTextView?

EDIT:

私は苦労するものと説明するコードを紹介します:

TextView textView = view.findViewById(R.id.mytext); 
    textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah"); 
    Linkify.addLinks(textView, Linkify.ALL); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     textView.setTextIsSelectable(true); 
    } 
+0

あなたは何をしているのですか?リンクされたものだけを動作させるようにしようとしていますか? –

+0

リンクを張ると、URLと電話をクリックできます。しかし、私がそれを選択可能にすると、これ以上クリックすることはできなくなります – pixel

答えて

15

あなたのTextViewのXMLコードでこれを追加しようとしましたか?

<TextView 
    ... 
    android:autoLink="all" 
    android:textIsSelectable="true" /> 

私のコードで試したことがあります。私はweb/mailで電話/サーフィンを行い、すべてのテキストを選択することもできます。

+0

追加時に正しく動作しないので、 'textView = inflater.inflate(R.layout.linkify_text_view、null)'のように、それはコードを介して。また、http:// commonswareもチェックしてください。com/blog/2013/10/23/linkify-autolink-need-custom-urlspan.html – Stan

2

問題はAndroidのTextViewです。 Linkify.addLinks()を呼び出すと、TextView自体の自動リンクマスクは変更されません。 私はそれがmAutoLinkMaskをチェックするAndroidのバグだと思います。 xmlファイルにandroid:autoLinkを設定するか、またはsetAutoLinkMask()を0以外の値に設定すると動作します。

FYI、TextViewのソースコード:

  if (touchIsFinished && mLinksClickable && mAutoLinkMask != 0 && textIsSelectable) { 
      // The LinkMovementMethod which should handle taps on links has not been installed 
      // on non editable text that support text selection. 
      // We reproduce its behavior here to open links for these. 
      ClickableSpan[] links = ((Spannable) mText).getSpans(getSelectionStart(), 
        getSelectionEnd(), ClickableSpan.class); 

      if (links.length > 0) { 
       links[0].onClick(this); 
       handled = true; 
      } 
     } 
13

autoLink属性は迷惑なバグがあります:あなたが電話番号にあなたの例ではクリックした場合、その後、戻って戻って、2番目のURLリンクをクリックしてください - それは電話番号を再度開きます。この属性は、ここでは、私は自分のクラスを実装していることを、複数のリンクがあるので、悪い作品は、XMLレイアウトの私のClickableLinksTextViewクラスによって、あなたのTextViewクラスを交換し、コードを変更することができ、あなたの例では

のGithub ClickableLinksTextView.java上のリンクありこのように:

ClickableLinksTextView textView = (ClickableLinksTextView)view.findViewById(R.id.mytext); 
textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah"); 
Linkify.addLinks(textView, Linkify.ALL); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    textView.setMovementMethod(ArrowKeyMovementMethod.getInstance()); 
    textView.setTextIsSelectable(true); 
    // the autoLink attribute must be removed, if you hasn't set it then ok, otherwise call textView.setAutoLink(0); 
} 

あなたの質問では、問題の元の原因はLinkMovementMethodクラスとtextIsSelectable属性もAndroid OSの開発者がthe Android OS source codeでこれを認め、全く互換性がないということです。

テキストの選択をサポートするテキストの移動方法を変更しないでください。これにより、カーソルの移動が妨げられます。

テキストビューが選択可能である場合、わずか2つの正しい移動方法値はnullArrowKeyMovementMethodあります。だから、Linkify.addLinksが不正な移動方法を設定していて、元に戻す必要があるため、私の例ではArrowKeyMovementMethodを明示的に設定しています。

autoLink属性のバグは、Android開発者がリンク検出を正しくコピーしていないためです。 @cheng yangの答えにあるコード例を見ることができますが、コードの数にかかわらず、コードは最初のリンクをとるだけです。

+0

textView.setMovementMethod(ArrowKeyMovementMethod.getInstance());それが私のために働くために必要なものです。 –

+0

他のカスタムスパンと混在した自分のURLSpansと一緒に使用すると、クラスがうまく動作します。それを提供してくれてありがとう! TextView APIがそのまま残されているので、ClickableLinksTextViewに明示的にキャストする必要はありません。 – Makibo

+0

ありがとう、それは多くを助ける –

関連する問題