私のレイアウトにTextViewがautoLink='web'
であり、それをクリックすると、TextViewのテキストとして提供されるURLで内部インターネットブラウザが開きます。良い。私が望むのは、ブラウザ上でそのURLを開くことのほかに、いくつか追加の操作をしたいということです。それを行う最も痛みを伴う方法は何ですか?autoLinkが "web"に設定されている場合、TextView catchのリンクをクリック
ベスト、
Deveti実際
私のレイアウトにTextViewがautoLink='web'
であり、それをクリックすると、TextViewのテキストとして提供されるURLで内部インターネットブラウザが開きます。良い。私が望むのは、ブラウザ上でそのURLを開くことのほかに、いくつか追加の操作をしたいということです。それを行う最も痛みを伴う方法は何ですか?autoLinkが "web"に設定されている場合、TextView catchのリンクをクリック
ベスト、
Deveti実際
、
私はautolLink='web'
を放棄することによって、および、HTMLのURLを解析SpannableString
を作成し、追加のスパンを設定することで、これを解決しました。だから、
、のは、私は次のことをやりたいと言ってみましょう:
someMethod()
は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つの実装を作成しなければなりませんでした。だから私はclickableNonURLSpan1
とclickableNonURLSpan2
を作ったのです。
「SpannableString」を使用してください。 –
これをチェックしてください。 http://stackoverflow.com/questions/12418279/android-textview-with-clickable-links-how-to-capture-clicks – peter