[解決済み] Android TextView with Clickable Links: クリックをキャプチャする方法とは?
2022-05-14 05:44:30
質問
私は2つ以上のリンクを含む基本的なHTMLをレンダリングしているTextViewを持っています。私はリンク上のクリックをキャプチャし、リンクを開く必要があります - 私自身の内部WebViewで (デフォルトのブラウザではありません。)。
リンクレンダリングを処理する最も一般的な方法は、次のようなものです。
String str_links = "<a href='http://google.com'>Google</a><br /><a href='http://facebook.com'>Facebook</a>";
text_view.setLinksClickable(true);
text_view.setMovementMethod(LinkMovementMethod.getInstance());
text_view.setText( Html.fromHtml( str_links ) );
しかし、これによってリンクはデフォルトの内部ウェブブラウザで開くことになります ("Complete Action Using..." というダイアログが表示されます)。
リンクがクリックされたときに適切にトリガーされる onClickListener を実装してみましたが、どのリンクがクリックされたかを判断する方法がわかりません...。
text_view.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// what now...?
}
});
あるいは、LinkMovementMethodのカスタムクラスを作成し、onTouchEventを実装してみましたが...。
public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
String url = text.toString();
// this doesn't work because the text is not necessarily a URL, or even a single link...
// eg, I don't know how to extract the clicked link from the greater paragraph of text
return false;
}
アイデア?
解決例
私が思いついたのは 解決策 という、HTML 文字列からリンクを解析してクリック可能にし、その URL に応答できるようにするソリューションを開発しました。
どのように解決するのですか?
ベースとなるのは 別の回答 , HTML文字列からリンクを解析してクリック可能にし、URLに応答できるようにする関数setTextViewHTML()はこちらです。
protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
{
int start = strBuilder.getSpanStart(span);
int end = strBuilder.getSpanEnd(span);
int flags = strBuilder.getSpanFlags(span);
ClickableSpan clickable = new ClickableSpan() {
public void onClick(View view) {
// Do something with span.getURL() to handle the link click...
}
};
strBuilder.setSpan(clickable, start, end, flags);
strBuilder.removeSpan(span);
}
protected void setTextViewHTML(TextView text, String html)
{
CharSequence sequence = Html.fromHtml(html);
SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
for(URLSpan span : urls) {
makeLinkClickable(strBuilder, span);
}
text.setText(strBuilder);
text.setMovementMethod(LinkMovementMethod.getInstance());
}
関連
-
[解決済み] TextViewでテキストを水平・垂直方向にセンタリングするには?
-
[解決済み] TextViewのtextStyle(太字、斜体など)を設定する方法
-
[解決済み] Androidのテキストビューの周りにボーダーを付けるには?
-
android block certificate validation CertPathValidatorException: 認証パスのトラストアンカーが見つかりません
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] TextViewのリンクをクリック可能にする方法
-
[解決済み] AndroidでTextViewをスクロール可能にする
-
[解決済み] TextViewにHTMLを表示するには?
-
[解決済み】AndroidでTextViewのfontFamilyを変更する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NetworkOnMainThreadException
-
Gradle のエラーです。gradle-core.jar (com.android.tools.build:gradle-core:x.x.x) を見つけられませんでした。
-
RuntimeException: アクティビティを開始できません ComponentInfo solution
-
最新のandroidプロジェクトディレクトリにあるarmeabi-v7aとarmeabiの具体的な意味とその違いを教えてください。
-
Google PlayデバイスはPlay保護機構の認証を受けていません。
-
Error:A problem occurred configuring project ':app'. > ビルドを見つけられませんでした。
-
view.getRootView()の本当の意味とテストについて
-
Android基本アプレット
-
Android studio 制約レイアウト ConstraintLayout
-
[解決済み] アンドロイドアプリでテキストビューのリンククリックを処理する