プロジェクトではリッチテキストを使用するのが一般的です。1行に複数のスタイルと色でテキストが表示されます。ClickableSpanリッチテキストは、同じTextView内のテキストの色、サイズ、背景色、およびその他の属性の多様化とパーソナライズを実現するために使用されます。
我々はまた、書き込みテキスト形式にHtml.fromHtml(文字列)を使用することができ、あなたがする必要があり注意を払うへ:
1.文字列が長すぎると、IOExceptionがスローされます
2.Html.fromHtml(文字列)は、文字列内の '\ r'および '\ n'をスペースに置き換えるため、html認識可能な '<br>'に明示的に置き換える必要があります。そうしないと、IOExceptionが報告されます。
3. Androidネイティブは一部のhtmlタグタグのみをサポートします
ClickableSpanの使用時に発生する問題:
ClickableSpanを使用して、応答イベントをTextViewのテキストに設定し、応答イベントをTextViewに設定します。ClickableSpanをクリックすると、2つのイベントが同時にトリガーされます。
一般的なケース:コメントの返信、テキストのクリック、ダイアログボックスのポップアップ、ニックネームのクリック、ユーザーのホームページの入力(フレンドサークルのコメントの返信)
理由:
1.ソースコードを確認して、TextView setMovementMethodの場合、LinkMovementMethodのonTouchEventメソッドも独自のonClickイベントをトリガーし、ビューに戻って処理します。このとき、TextViewもイベントを消費するため、2つのイベントがトリガーされます。
2. TextView setMovementMethodメソッド。以下の3つのメソッドはデフォルトでtrueに設定されています。Androidのイベント配信メカニズムに従って、TextViewもイベントを消費します。
setFocusable(true); setClickable(true); setLongClickable(true);
解決方法:
上記の例では、TextViewのクリックイベントを無効にできます。テキストがクリックされると、処理のために親クラスに渡されます。ニックネームとClickableSpanをクリックして、ユーザーのホームページに入ります
1. LinkMovementMethodを書き換えて、onTouchEventをfalseとして返します。
2. TextViewはクリックできません。
setFocusable(false);
setClickable(false);
setLongClickable(false);
問題コード
:
ClickableSpanをクリックし、ログ出力:
変更されたコード:
ClickableMovementMethodの変更:
クラスClickableMovementMethod:LinkMovementMethod(){ コンパニオンオブジェクト{ val mInstance by lazy(LazyThreadSafetyMode.NONE){ ClickableMovementMethod() } } オーバーライドfun onTouchEvent(widget:TextView、buffer:Spannable、event:MotionEvent):Boolean { val action = event.action if(action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN){ var x = event.x.toInt() var y = event.y.toInt() x- = widget.totalPaddingLeft y- =widget.totalPaddingTop x + = widget.scrollX y + = widget.scrollY val layout = widget.layout val line = layout.getLineForVertical(y) val off = layout.getOffsetForHorizontal(line、x.toFloat()) val links = buffer。 getSpans(off、off、ClickableSpan :: class .java) if(links.size!= 0 ){ val link = links [0 ] if(action == MotionEvent.ACTION_UP){ link.onClick(widget) } else if(action == MotionEvent.ACTION_DOWN){ Selection.setSelection( buffer、 buffer.getSpanStart(link)、 buffer.getSpanEnd(link) ) } return true } else { Selection.removeSelection(buffer) } } falseを返し ます } }
ログ出力:
ClickableSpanをクリックします。
テキストをクリックしてください:
参照リンク: