2016-09-12 7 views
0

私のレイアウトにTextViewがautoLink='web'であり、それをクリックすると、TextViewのテキストとして提供されるURLで内部インターネットブラウザが開きます。良い。私が望むのは、ブラウザ上でそのURLを開くことのほかに、いくつか追加の操作をしたいということです。それを行う最も痛みを伴う方法は何ですか?autoLinkが "web"に設定されている場合、TextView catchのリンクをクリック

ベスト、

Deveti実際

+1

「SpannableString」を使用してください。 –

+1

これをチェックしてください。 http://stackoverflow.com/questions/12418279/android-textview-with-clickable-links-how-to-capture-clicks – peter

答えて

1

私はautolLink='web'を放棄することによって、および、HTMLのURLを解析SpannableStringを作成し、追加のスパンを設定することで、これを解決しました。だから、

、のは、私は次のことをやりたいと言ってみましょう:

  • ユーザーがURLではないのTextViewのテキストの一部をクリックすると、ユーザーがクリックした場合、方法someMethod()
  • と呼ばれるべきですURL、メソッドsomeMethod()が呼ばれるべきであると、ブラウザが最初に我々は変数messageと方法であるコンテンツを持っている、

だから、与えられたURLでopennedしなければならないのTextViewのテキストの一部がURLの取得に使用されます。私の場合、私は私が唯一の1つのURLを持っていることを知っているが、複数のURLを期待することができれば、このソリューション(StackOverflowの上のどこかに見つかったが、今それを見つけることができません)行います:注

private static String extractFirstLink(String text) { 
    Matcher m = Patterns.WEB_URL.matcher(text); 
    return m.find() ? m.group() : null; 
} 

作品:いくつかの興味深いものがここにあります

int contentTextColor = ...; // color of non-url text in textView 
int urlTextColor = ...; 
String message = notification.getMessage(); // content stored 
final String foundLink = extractFirstLink(message); 
SpannableString styledString = new SpannableString(message); 

if (foundLink != null) { 
    int startPosition = message.indexOf(foundLink); 
    int endPosition = startPosition + foundLink.length(); 
    styledString.setSpan(new ForegroundColorSpan(urlTextColor), startPosition, endPosition, 0); 

    ClickableSpan clickableURLSpan = new ClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      someMethod(); 
      Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(foundLink)); 
      widget.getContext().startActivity(browserIntent); 
     } 
    }; 

    ClickableSpan clickableNonURLSpan1 = new ClickableSpan() { 
     @Override 
     public void onClick(View view) { 
      someMethod(); 
     } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      ds.setUnderlineText(false); 
     } 
    }; 
    ClickableSpan clickableNonURLSpan2 = new ClickableSpan() { 
     @Override 
     public void onClick(View view) { 
      someMethod(); 
     } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      ds.setUnderlineText(false); 
     } 
    }; 
    styledString.setSpan(clickableURLSpan, startPosition, endPosition, 0); 
    if (startPosition > 0) { 
     styledString.setSpan(clickableNonURLSpan1, 0, startPosition - 1, 0); 
     styledString.setSpan(new ForegroundColorSpan(contentTextColor), 0, startPosition -1, 0); 
    } 
    if (endPosition < message.length() -1) { 
     styledString.setSpan(clickableNonURLSpan2, endPosition + 1, message.length(), 0); 
     styledString.setSpan(new ForegroundColorSpan(contentTextColor), endPosition + 1, message.length(), 0); 
    } 

    txtView.setMovementMethod(LinkMovementMethod.getInstance()); 
} 

txtView.setText(styledString); 

public static String[] extractLinks(String text) { 
    List<String> links = new ArrayList<String>(); 
    Matcher m = Patterns.WEB_URL.matcher(text); 
    while (m.find()) { 
     String url = m.group(); 
     links.add(url); 
    } 
    return links.toArray(new String[links.size()]); 
} 

だから、ここのコードです。たとえば、クリックに反応するスパンを作成する場合は、ClickableSpanを使用する必要がありますが、!私はtext1-url-text2という形式を取っている状況を処理しなければならない。したがって、これらの3つの部分はすべてClickableSpanである必要があり、text1とtext2にはデフォルトの動作であるアンダーラインを使用しないでください。ClickableSpanのtext1とtext2の実装ではupdateDrawStateメソッドをオーバーライドしなければなりません。

もう1つのキャッチがあります。意図したとおりに動作させるためにClickableSpanインターフェイスの2つの実装を作成しなければなりませんでした。だから私はclickableNonURLSpan1clickableNonURLSpan2を作ったのです。

関連する問題