Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.sudox.design.views
- import android.annotation.SuppressLint
- import android.content.Context
- import android.text.InputType
- import android.util.AttributeSet
- import android.view.Gravity
- import android.view.ViewGroup
- import android.widget.EditText
- import androidx.appcompat.widget.AppCompatEditText
- import androidx.core.content.res.getDimensionPixelSizeOrThrow
- import androidx.core.content.res.getIntOrThrow
- import androidx.core.content.res.use
- import com.sudox.design.R
- import kotlin.math.min
- class CodeEditText : ViewGroup {
- private var digitEditTexts: Array<EditText>? = null
- private var digitsMargin = 0
- private var digitWidth = 0
- constructor(context: Context) : this(context, null)
- constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, R.attr.codeEditTextStyle)
- @SuppressLint("Recycle")
- constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
- context
- .obtainStyledAttributes(attrs, R.styleable.CodeEditText, defStyleAttr, R.style.Theme_Sudox_CodeEditText)
- .use {
- digitsMargin = it.getDimensionPixelSizeOrThrow(R.styleable.CodeEditText_digitsMargin)
- digitWidth = it.getDimensionPixelSizeOrThrow(R.styleable.CodeEditText_digitWidth)
- val digitsCount = it.getIntOrThrow(R.styleable.CodeEditText_digitsCount)
- digitEditTexts = Array(digitsCount) {
- AppCompatEditText(context).apply {
- minWidth = digitWidth
- maxWidth = digitWidth
- gravity = Gravity.CENTER_HORIZONTAL
- inputType = InputType.TYPE_NUMBER_FLAG_DECIMAL
- isSingleLine = true
- maxLines = 1
- addView(this, LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT))
- }
- }
- }
- }
- override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
- val widthSize = MeasureSpec.getSize(widthMeasureSpec)
- val widthMode = MeasureSpec.getMode(widthMeasureSpec)
- val digitsWidth = digitEditTexts!!.sumBy {
- measureChild(it, widthMeasureSpec, heightMeasureSpec)
- it.measuredWidth
- }
- val needHeight = digitEditTexts!![0].measuredHeight + paddingTop + paddingBottom
- val needWidth = digitsWidth + digitsMargin * (digitEditTexts!!.size - 1) + paddingRight + paddingLeft
- val width = if (widthMode == MeasureSpec.EXACTLY) {
- widthSize
- } else if (widthMode == MeasureSpec.AT_MOST) {
- min(widthSize, needWidth)
- } else {
- needWidth
- }
- setMeasuredDimension(width, needHeight)
- }
- override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
- val topBorder = paddingTop
- val bottomBorder = topBorder + digitEditTexts!![0].measuredHeight
- var leftBorder = paddingLeft
- digitEditTexts!!.forEach {
- val rightBorder = leftBorder + it.measuredWidth
- it.layout(leftBorder, topBorder, rightBorder, bottomBorder)
- leftBorder = rightBorder + digitsMargin
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement