tinkoff-mobile-tech / decoro

Android library designed for automatic formatting of text input by custom rules
Apache License 2.0
391 stars 31 forks source link

Placeholder по умолчанию не работает #41

Open IvanGalitskiy opened 6 years ago

IvanGalitskiy commented 6 years ago

При использовании символа _ в качестве placeholder-a он не отображается. При использовании любого другого все работает.

    Slot[] slots = new UnderscoreDigitSlotsParser().parseSlots("+7 (___) ___-__-__");
    final MaskImpl mask = MaskImpl.createTerminated(slots);

    mask.setPlaceholder('_');

    mask.setShowingEmptySlots(true);
    mask.setForbidInputWhenFilled(true);

    FormatWatcher formatWatcher = new MaskFormatWatcher(mask);
    formatWatcher.installOn(vPhoneEditText);`
IlyaSergeev commented 6 years ago

Наткнулся на такую же проблему. Тут проблема в том, что при выставлении у EditText inputType=InputType.TYPE_CLASSPHONE устанавливается keyListener = android.text.method.DialerKeyListener. DialerKeyListener фильтрует все символы, которых не может быть в номере телефона, в том числе и ``. Чтобы обойти это ограничение можно сделать свой KeyListener и принудительно выставить его для EditText. Например, вот так (пример на kotlit):


import android.text.method.DialerKeyListener

class PhoneKeyListener : DialerKeyListener()
{
    companion object
    {
        val instance by lazy { PhoneKeyListener() }

        private val CHARACTERS = charArrayOf('0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '#' , '*' , '+' , '-' , '(' , ')' , ',' , '/' , 'N' , '.' , ' ' , ';' , '_')
    }

    override fun getAcceptedChars() : CharArray
    {
        return CHARACTERS
    }
}

после инициализации EditText выставляем phoneEditText.keyListener = PhoneKeyListener.instance теперь EditText перестанет фильтровать _ и маска заработает