Home > Back-end >  how to make ellipsized text with rules character more than 65 in android?
how to make ellipsized text with rules character more than 65 in android?

Time:01-28

    class EllipsizedTextView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0): AppCompatTextView(context, attrs, defStyleAttr) {
    
        private var ellipsis = getDefaultEllipsis().toString()
        private var ellipsisColor = getDefaultEllipsisColor()
        private var isEllipsis = false
    
        private var ellipsizedText: CharSequence? = null
        private var callbackEllipsized: MoreClickableSpan? = null
    
        init {
            attrs?.let { attributeSet ->
                context.theme.obtainStyledAttributes(attributeSet, R.styleable.EllipsizedTextView, 0, 0).apply {
                    ellipsis = getString(R.styleable.EllipsizedTextView_ellipsis) ?: getDefaultEllipsis().toString()
                    ellipsisColor = getColor(R.styleable.EllipsizedTextView_ellipsisColor, getDefaultEllipsisColor())
    
                    recycle()
                }
            }
        }
    
        override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec)
    
            /*
                Prepare to set custom ellipsize text
             */
    
            val availableScreenWidth = measuredWidth - compoundPaddingLeft.toFloat() - compoundPaddingRight.toFloat()
            var availableTextWidth = availableScreenWidth * maxLines
    
            ellipsizedText = TextUtils.ellipsize(text, paint, availableTextWidth, ellipsize, false) { start, end ->
                isEllipsis = start != 0 && end >= 65
            }
    
            if (isEllipsis) { // check if current text is ellipsized or not
                printLog("isEllipsis: $ellipsizedText ellipsis: $ellipsis, text : $text")
                // If the ellipsizedText is different than the original text, this means that it didn't fit and got indeed ellipsized.
                // Calculate the new availableTextWidth by taking into consideration the size of the custom ellipsis, too.
                availableTextWidth = (availableScreenWidth - paint.measureText(ellipsis)) * maxLines
                ellipsizedText = TextUtils.ellipsize(text, paint, availableTextWidth, ellipsize, false){ start, end ->
                    isEllipsis = start != 0 && end >= 65
                }
            }
    
            setEllipsizedText(ellipsizedText, isEllipsis)
        }
        
        private fun setEllipsizedText(value: CharSequence?, isEllipsized: Boolean){
            printLog("setEllipsizedText > $isEllipsized")
            if(isEllipsized){
                val resultText = "$value$ellipsis"
                val startPoint = resultText.indexOf(ellipsis)
                val endPoint = startPoint   ellipsis.length
    
                val spannable = SpannableString(resultText).apply {
                    callbackEllipsized?.let { callback ->
                        printLog("setEllipsizedText > implement callbackEllipsized")
    
                        // set event click on spannable
                        setSpan(callback, startPoint, endPoint, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    
                        // set color on target text while enable to click
                        setSpan(ForegroundColorSpan(ellipsisColor), startPoint, endPoint, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
                    }
                }
    
                //val defaultEllipsisStart = value.indexOf(getDefaultEllipsis())
                //val defaultEllipsisEnd = defaultEllipsisStart   1
                //text = spannableStringBuilder.append(ellipsizedText).replace(defaultEllipsisStart, defaultEllipsisEnd, ellipsisSpannable)
                text = spannable
                movementMethod = LinkMovementMethod.getInstance()
    
                printLog("setEllipsizedText > text : $text")
            }
        }
    
        private fun getDefaultEllipsis(): Char {
            return Typography.ellipsis
        }
    
        private fun getDefaultEllipsisColor(): Int {
            return textColors.defaultColor
        }
    
        fun setActionClickEllipse(callback: MoreClickableSpan){
            this.callbackEllipsized = callback
        }
    
        fun isReadMore(): Boolean = isEllipsis
    
        @Suppress("unused_parameter")
        fun printLog(msg: String) { }
    
        open class MoreClickableSpan : ClickableSpan() {
    
            override fun onClick(widget: View) {}
    
            override fun updateDrawState(ds: TextPaint) {}
        }
    }

Good Morning Everyone, i want to ask this to all. How to implement ellipsized text with rules if more than 65 character? Thank you very much , my existing code with code kotlin below like this,please help me sir, because i want to fix this today, if you want to ask more question please comment in below ok

CodePudding user response:

Why don't you add this to your TextView in the xml file?It will limit it to 65 chars and it will show ellipse after that

android:maxLength="65" 
android:ellipsize="end"
android:maxLines="1"
  •  Tags:  
  • Related