TextViewのリッチテキスト

プロジェクトではリッチテキストを使用するのが一般的です。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.getOffsetForHorizo​​ntal(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をクリックします。

テキストをクリックしてください:

 

 

参照リンク:

おすすめ

転載: www.cnblogs.com/fangg/p/12752623.html