33505


Spannableを使用してTextView内のURLのリンクをタップできるようにしたのですがellipsizeの設定が無効になってしまいます。  
海外のStackOverFlowでも同じような質問がありましたがイマイチ解決策が分かりません。

<https://stackoverflow.com/questions/14691511/textview-using-spannable-
ellipsize-doesnt-work>

解決方法について知見のある方がいらっしゃれば教えていただければと思います。

下記が現在のコードです。  
xml

[code]

    <TextView
        android:id="@+id/message"
        style="@style/MessageStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
[/code]

style

[code]

    <style name="MessageStyle">
        <item name="android:maxLines">5</item>
        <item name="android:ellipsize">end</item>
        <item name="android:textSize">14sp</item>
        <item name="android:textColor">@color/textColorSubTitle</item>
    </style>
    
[/code]

SpannableStringのカスタムクラス

[code]

    public class URLLinkSpannableString extends android.text.SpannableString {
    
        public URLLinkSpannableString(CharSequence c) {
            super(c);
    
            final Pattern URL_PATTERN = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:\\#\\?\\=\\&\\;\\%\\~\\+]+", Pattern.CASE_INSENSITIVE);
            final Matcher matcher = URL_PATTERN.matcher(c);
    
            while (matcher.find()) {
                String matcherText = matcher.group();
                setSpan(new URLSpan(matcherText), matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }
    
[/code]

TextViewにセットする部分（※RecyclerViewAdapter内で使用しています。）

[code]

        holder.getMessageTextView().setText(new URLLinkSpannableString(activity.getMessage()));
        holder.getMessageTextView().setMovementMethod(LinkMovementMethod.getInstance());
    
[/code]


CC BY-SA 3.0
2017-03-22T05:36:13.133
33452
2017-03-24T04:52:24.007
2017-05-23T12:38:56.467
-1
19378
question
android
TextViewでellipsizeとSpannableを同時に使用したい


[こちら](https://stackoverflow.com/a/30446822)の回答が参考になるかと思います。  
ViewTreeObserverをTextViewにセットして描画後にellipsizeとSpannableの処理を行います。

[code]

        // 未加工のテキストをセット
        holder.getMessageTextView().setText(activity.getMessage());
        holder.getMessageTextView().setMovementMethod(LinkMovementMethod.getInstance());
    
        // 描画完了を受け取るリスナーを登録
        ViewTreeObserver viewTreeObserver = holder.getMessageTextView().getViewTreeObserver();
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                ViewTreeObserver viewTreeObserver = holder.getMessageTextView().getViewTreeObserver();
                viewTreeObserver.removeOnGlobalLayoutListener(this);
    
                if (holder.getMessageTextView().getLineCount() > 5) {
                    // ellipsize後のテキストを取得
                    int endOfLastLine = textView.getLayout().getLineEnd(4);
                    String newVal = holder.getMessageTextView().getText().subSequence(0, endOfLastLine - 3) + "...";
    
                    // ellipsize後のテキストにSpannableをする
                    holder.getMessageTextView().setText(new URLLinkSpannableString(newVal));
                }
            }
        });
    
[/code]

RecyclerViewで使う場合は毎回この処理を行うとパフォーマンスが低下するので、キャッシュする仕組みも入れた方がいいでしょう。


CC BY-SA 3.0
2017-03-24T02:35:10.420
33505
2017-03-24T04:52:24.007
2017-05-23T12:38:55.307
-1
21081
33452
answer