Поставьте косую черту в дате редактирования текста - PullRequest
1 голос
/ 14 июня 2019

Я прочитал много похожих вопросов, но никто не отвечает на мои и не может решить мою проблему. У меня есть EditText, как это в макете:

    <EditText
        android:id="@+id/editText2"
        android:layout_width="248dp"
        android:layout_height="59dp"
        android:layout_marginStart="21dp"
        android:layout_marginTop="36dp"
        android:width="360dp"
        android:ems="5"
        android:hint="@string/ultimos4Dig"
        android:inputType="number"
        android:maxLength="10"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

Мне нужно, чтобы, когда пользователь пишет цифры месяца и года, появлялась или исчезала косая черта, когда он пишет. Если он пишет 2 числа, то должен появиться слеш. Если он стирает и имеет только одно число, то слеш должен исчезнуть.

Мне нужно, чтобы в editText появилась дата как: 14/06

Вот мой код, но он не работает.

  protected void onCreate(Bundle savedInstanceState) {

        EditText editText2 = (EditText)  findViewById(R.id.editText2);
        editText2.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }
            @Override
            public void afterTextChanged(Editable text) {
                if (text.length() == 2) {
                    text.append('/');
                }
            }
        });

К вашему сведению, я сделал класс для решения этой проблемы, спасибо

Ответы [ 3 ]

0 голосов
/ 20 июня 2019

Использовать замаскированный текст редактирования.

https://github.com/santalu/mask-edittext

<com.santalu.maskedittext.MaskEditText
    android:id="@+id/editText2"
    android:layout_width="248dp"
    android:layout_height="59dp"
    android:layout_marginStart="21dp"
    android:layout_marginTop="36dp"
    android:width="360dp"
    android:ems="5"
    android:hint="@string/ultimos4Dig"
    android:inputType="number"
    android:maxLength="10"
    android:textSize="24sp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:met_mask="##/##"/>
0 голосов
/ 25 июня 2019

Спасибо, через несколько дней я получил решение, этот класс:

public class EditMMYY extends AppCompatEditText implements TextWatcher
{
    private String sPrev = "";
    private int iMon = 0;
    private int iYear = 0;

    private void InitValue()
    {
        setInputType(InputType.TYPE_CLASS_NUMBER);
        setFilters(new InputFilter[] {new InputFilter.LengthFilter(5)});
        setHint("MM/YY");
    }

    public EditMMYY(Context context)
    {
        super(context);
        InitValue();
    }

    public EditMMYY(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        InitValue();
    }

    public EditMMYY(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
        InitValue();
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count)
    {
        // Chequeo que el ingreso sea MM/YY
        String sNew = s.toString();
        int newLen = sNew.length();

        if(sNew.equals(sPrev))
        {
            return;
        }
        switch(newLen)
        {
            case 0:
                iMon = 0;
                iYear = 0;
                sPrev = sNew;
                break;
            case 1:
                iMon  = Integer.parseInt(sNew);
                iYear = 0;
                if(sPrev.length() == 0 && iMon > 1)
                {    // Si se escribe un número mayor que 1, lo tomo como mes
                    sPrev = String.format("%02d/", iMon);
                }
                else
                {
                    sPrev = sNew;
                }
                break;
            case 2:
                iMon  = Integer.parseInt(sNew);
                iYear = 0;
                if(sPrev.length() == 1)
                {
                    // Si ya es un mes válido, lo completo, sino dejo
                    // sPrev sin cambios hasta que se ingrese algo válido
                    if(iMon >= 1 && iMon <= 12)
                    {
                        sPrev = String.format("%02d/", iMon);
                    }
                }
                else
                {
                    sPrev = sNew;
                }
                break;
            case 3:
                iMon  = Integer.parseInt(sNew.substring(0, 2));
                iYear = 0;
                if(sPrev.length() == 2)
                {
                    iMon = Integer.parseInt(sNew.substring(0, 2));
                    iYear = Integer.parseInt(sNew.substring(2, 3));
                    sPrev = String.format("%02d/%d", iMon, iYear);
                }
                else
                {
                    sPrev = sNew;
                }
                break;
            case 4:
            case 5:
                iMon = Integer.parseInt(sNew.substring(0, 2));
                iYear = Integer.parseInt(sNew.substring(3, newLen));
                sPrev = sNew;
                break;
            default:
                sPrev = sNew;
                break;
        }
        setText(sPrev);
        setSelection(sPrev.length());
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
    {
    }

    @Override
    public void afterTextChanged(Editable s)
    {

    }

    public int getMon()
    {
        return iMon;
    }

    public int getYear()
    {
        return iYear;
    }
}
0 голосов
/ 17 июня 2019

Добавьте вашу логику в onTextChanged вместо afterTextChanged

Пожалуйста, попробуйте ниже код:

editText2 .addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                String str=editText2 .getText().toString();
                int textLength=editText2 .getText().length();
                if (textLength == 3) {
                    if (!str.contains("/")) {
                        editText2 .setText(new StringBuilder(editText2 .getText().toString()).insert(str.length() - 1, "/").toString());
                        editText2 .setSelection(editText2 .getText().length());
                    }
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

Я надеюсь, что это сработает для вас.

...