Custom PinEntryView - символы по умолчанию - PullRequest
0 голосов
/ 28 марта 2019

У меня есть пользовательская функция EditText providig PinEntry, похожая на эту:

class PinEntryView : EditText {

private var mSpace = 15f
private var mCharSize = 0f
private var mNumChars = 4f
private var mLineSpacing = 8f
private val XML_NAMESPACE_ANDROID = "http://schemas.android.com/apk/res/android"
private var mClickListener: View.OnClickListener? = null
private var mLineStroke = 1f
private var mLinesPaint: Paint? = null
private var mOnPinEnteredListener: OnPinEnteredListener? = null

private fun updateColorForLines(next: Boolean) {
    if (isFocused) {
        mLinesPaint!!.color = getColor(context, android.R.color.transparent)
        if (next) {
            mLinesPaint!!.color = getColor(context, R.color.edit_text_background)
        }
    } else {
        mLinesPaint!!.color = getColor(context, android.R.color.transparent)
    }
}

constructor(context: Context) : super(context)

constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
    init(context, attrs)
}

constructor(
    context: Context, attrs: AttributeSet,
    defStyleAttr: Int
) : super(context, attrs, defStyleAttr) {
    init(context, attrs)
}

private fun init(context: Context, attrs: AttributeSet) {
    val multi = context.resources.displayMetrics.density

    mLineStroke *= multi
    mLinesPaint = Paint(paint)
    mLinesPaint!!.strokeWidth = mLineStroke

    mSpace *= multi
    mLineSpacing *= multi
    val mMaxLength = attrs.getAttributeIntValue(
        XML_NAMESPACE_ANDROID,
        "maxLength",
        6
    )

    paint.color = getColor(context, android.R.color.white)

    mNumChars = mMaxLength.toFloat()

    super.setCustomSelectionActionModeCallback(
        object : ActionMode.Callback {
            override fun onPrepareActionMode(
                mode: ActionMode,
                menu: Menu
            ): Boolean {
                return false
            }

            override fun onDestroyActionMode(mode: ActionMode) {}

            override fun onCreateActionMode(
                mode: ActionMode,
                menu: Menu
            ): Boolean {
                return false
            }

            override fun onActionItemClicked(
                mode: ActionMode,
                item: MenuItem
            ): Boolean {
                return false
            }
        })

    super.setOnClickListener { v ->
        setSelection(text.length)
        if (mClickListener != null) {
            mClickListener!!.onClick(v)
        }
    }
}

override fun setOnClickListener(l: OnClickListener) {
    mClickListener = l
}

override fun onDraw(canvas: Canvas) {
    val availableWidth = width - paddingRight - paddingLeft
    mCharSize = if (mSpace < 0) {
        (availableWidth / (mNumChars * 2 - 1))
    } else {
        (availableWidth - mSpace * (mNumChars - 1)) / mNumChars
    }

    var startX = paddingLeft.toFloat()
    val bottom = height.toFloat() - paddingBottom.toFloat()

    val text = text
    val textLength = text.length
    val textWidths = FloatArray(textLength)
    paint.getTextWidths(getText(), 0, textLength, textWidths)

    for (i in 0 until mNumChars.toInt()) {
        updateColorForLines(i == textLength)
        canvas.drawRoundRect(
            startX, 0f, startX + mCharSize, height.toFloat(), 5f, 5f, mLinesPaint
        )
        if (text.length > i) {
            val middle = startX + mCharSize / 2
            canvas.drawText(
                "******",
                i,
                i + 1,
                middle - textWidths[0] / 2,
                bottom - mLineSpacing,
                paint
            )
        }
        startX += if (mSpace < 0) {
            mCharSize * 2
        } else {
            mCharSize + mSpace
        }
    }
}

override fun onTextChanged(text: CharSequence, start: Int, lengthBefore: Int, lengthAfter: Int) {
    if (mOnPinEnteredListener != null && text.length.toFloat() == mNumChars) {
            mOnPinEnteredListener!!.onPinEntered(text)
    }
}

fun setOnPinEnteredListener(l: OnPinEnteredListener) {
    mOnPinEnteredListener = l
}

interface OnPinEnteredListener {
    fun onPinEntered(str: CharSequence)
}
}

Я следовал этому уроку: https://medium.com/@ali.muzaffar/building-a-pinentryedittext-in-android-5f2eddcae5d3

И я получаю поведение, показанное на картинке: enter image description here

Но я хотел бы иметь поведение, показанное здесь: enter image description here

Как мне этого добиться?Как я могу добавить эти точки / символы по умолчанию?Я попытался добавить его как подсказку или текст по умолчанию, но он не работает из-за моей функции onDraw

1 Ответ

0 голосов
/ 08 мая 2019

Надеюсь, вы уже нашли свое решение.Но вот как я бы это сделал:

У PinEntryEditText есть атрибут, который вы можете установить в файле .xml.Добавление этого к элементу поможет: app:pinSingleCharHint="•"

Для дополнительной настройки ознакомьтесь с примером XML из this page

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...