Автоматически добавлять тире в номер телефона в Android

Вместо 5118710 это должно быть 511-8710 . Я хотел бы добавить тире после того, как пользователь ввел 3 цифры уже в EditText. Максимальная длина EditText – только 7 цифр.

После того, как я понял эту проблему, я снова застрял в кодировании. Когда я уже ввел 3 цифры, он добавляет тире (это то, что я хотел бы произойти), но моя проблема заключается в том, что следующие 3 цифры также добавляют тире (например: 511-871- ) … Пожалуйста, помогите мне с этим , благодаря!

  txt_HomeNo.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { boolean flag = true; String eachBlock[] = txt_HomeNo.getText().toString().split("-"); for (int i = 0; i < eachBlock.length; i++) { if (eachBlock[i].length() > 3) { flag = false; } } if (flag) { txt_HomeNo.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DEL) keyDel = 1; return false; } }); if (keyDel == 0) { if (((txt_HomeNo.getText().length() + 1) % 4) == 0) { if (txt_HomeNo.getText().toString().split("-").length <= 3) { txt_HomeNo.setText(txt_HomeNo.getText() + "-"); txt_HomeNo.setSelection(txt_HomeNo.getText().length()); } } a = txt_HomeNo.getText().toString(); } else { a = txt_HomeNo.getText().toString(); keyDel = 0; } } else { txt_HomeNo.setText(a); } } 

addTextChangedListener следующий модифицированный addTextChangedListener для txt_HomeNo . Приведенный ниже код проверяет, является ли длина введенного текста 3, а затем добавляется к нему. Не очень надежное решение, но оно работает!

 txt_HomeNo.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { txt_HomeNo.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DEL) keyDel = 1; return false; } }); if (keyDel == 0) { int len = txt_HomeNo.getText().length(); if(len == 3) { txt_HomeNo.setText(txt_HomeNo.getText() + "-"); txt_HomeNo.setSelection(txt_HomeNo.getText().length()); } } else { keyDel = 0; } } @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } }); 

Наиболее простым решением является использование PhoneNumberFormattingTextWatcher который будет отформатировать номер в соответствии с языковым стандартом системы.

XML:

 <EditText android:id="@+id/phone_number" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/enter_phone_number" android:inputType="phone" /> 

Добавьте addTextChangedListener() в свой класс:

 EditText phoneNumber = (EditText)findViewById(R.id.phone_number); phoneNumber.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); 

У меня есть несколько небольших изменений в решении neo108, поэтому он может работать как с мягкой клавиатурой, так и с жесткой клавиатурой, в моем коде, например, edittext будет следовать правилу, чтобы автоматически добавлять «» в позиции 5 и 9.

 txtPhone.addTextChangedListener(new TextWatcher() { int keyDel; @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { txtPhone.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { if (keyCode == KeyEvent.KEYCODE_DEL) { keyDel = 1; } return false; } }); String currentString = txtPhone.getText().toString(); int currentLength = txtPhone.getText().length(); if (currentLength == 5 || currentLength == 9) { keyDel = 1; } if (keyDel == 0) { if (currentLength == 4 || currentLength == 8) { txtPhone.setText(txtPhone.getText() + " "); txtPhone.setSelection(txtPhone.getText().length()); } } else { if (currentLength != 5 && currentLength != 9) { keyDel = 0; } else if ((currentLength == 5 || currentLength == 9) && !" ".equals(currentString.substring(currentLength - 1, currentLength))) { txtPhone.setText(currentString.substring(0, currentLength - 1) + " " + currentString.substring(currentLength - 1, currentLength)); txtPhone.setSelection(txtPhone.getText().length()); } } } 

Сделайте это самостоятельно, используя OnEditTextChangedListener и вставьте тире, подсчитав количество символов, счетные символы в EditText Changed Listener

Спасибо за весь ответ.

  • Функция editText.setOnKeyListener () никогда не будет вызываться, если ваше устройство имеет только мягкую клавиатуру.
  • Если мы строго следуем правилу, чтобы добавить «-» , то этот код не всегда показывает результат желания.

    EditText.addTextChangedListener (новый PhoneNumberFormattingTextWatcher ());

Но выше код – лучшее решение для форматирования номера телефона.

Помимо выше этого решения, я пишу код, который работает на всех типах условий ::

 phoneNumber.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) { } @Override public void afterTextChanged(Editable s) { if (len > phoneNumber.getText().length() ){ len--; return; } len = phoneNumber.getText().length(); if (len == 4 || len== 8) { String number = phoneNumber.getText().toString(); String dash = number.charAt(number.length() - 1) == '-' ? "" : "-"; number = number.substring(0, (len - 1)) + dash + number.substring((len - 1), number.length()); phoneNumber.setText(number); phoneNumber.setSelection(number.length()); } } }); 

Эта строка кода, необходимая для добавления «-» на 3-й и 6-й позиции номера. If (len == 4 || len == 8)