Я хочу, чтобы пользователь вводил номер телефона в editText, чтобы динамически изменять формат каждый раз, когда пользователь вводит номер. То есть, когда пользователь вводит до 4 цифр, например 7144, в editText отображается "714-4". Я бы хотел, чтобы editText динамически обновлялся, чтобы форматировать ### - ### - #### всякий раз, когда пользователь вводит цифру. Как это может быть сделано? Кроме того, я обрабатываю несколько текстовых файлов.
Маска EditText с номером номера телефона NaN, как в PhoneNumberUtils
Ответ 1
Самый простой способ сделать это - использовать встроенный Android PhoneNumberFormattingTextWatcher.
Итак, в основном вы получаете свой EditText в коде и устанавливаете свой наблюдатель текста следующим образом:
EditText inputField = (EditText) findViewById(R.id.inputfield);
inputField.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
Хорошая вещь об использовании PhoneNumberFormattingTextWatcher заключается в том, что он правильно отформатирует ваш номер в зависимости от вашей локали.
Ответ 2
Выше ответ правильный, но он работает со спецификой страны. если кому-то нужен такой форматированный номер телефона (### - ### - ####). Затем используйте это:
etPhoneNumber.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
int digits = etPhoneNumber.getText().toString().length();
if (digits > 1)
lastChar = etPhoneNumber.getText().toString().substring(digits-1);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
int digits = etPhoneNumber.getText().toString().length();
Log.d("LENGTH",""+digits);
if (!lastChar.equals("-")) {
if (digits == 3 || digits == 7) {
etPhoneNumber.append("-");
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
Объявите String lastChar = " "
в своей деятельности.
Теперь добавьте эту строку в xml вашего edittext
android:inputType="phone"
Что все.
Отредактировано: Если вы хотите, чтобы длина edittext ограничивала 10 цифр, добавьте также строку ниже:
android:maxLength="12"
(Это 12, потому что "-" займет пространство два раза)
Ответ 3
Просто добавьте следующее в EditText для номера телефона, чтобы получить форматированный номер телефона (### - ### - ####)
Phone.addTextChangedListener(new TextWatcher() {
int length_before = 0;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
length_before = s.length();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (length_before < s.length()) {
if (s.length() == 3 || s.length() == 7)
s.append("-");
if (s.length() > 3) {
if (Character.isDigit(s.charAt(3)))
s.insert(3, "-");
}
if (s.length() > 7) {
if (Character.isDigit(s.charAt(7)))
s.insert(7, "-");
}
}
}
});
Ответ 4
Мой script, пример взятый здесь описание здесь
<android.support.design.widget.TextInputLayout
android:id="@+id/numphone_layout"
app:hintTextAppearance="@style/MyHintText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/edit_text_numphone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/MyEditText"
android:digits="+() 1234567890-"
android:hint="@string/hint_numphone"
android:inputType="phone"
android:maxLength="17"
android:textSize="14sp" />
</android.support.design.widget.TextInputLayout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextInputEditText phone = (TextInputEditText) findViewById(R.id.edit_text_numphone);
//Add to mask
phone.addTextChangedListener(textWatcher);
}
TextWatcher textWatcher = new TextWatcher() {
private boolean mFormatting; // this is a flag which prevents the stack overflow.
private int mAfter;
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// nothing to do here..
}
//called before the text is changed...
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//nothing to do here...
mAfter = after; // flag to detect backspace..
}
@Override
public void afterTextChanged(Editable s) {
// Make sure to ignore calls to afterTextChanged caused by the work done below
if (!mFormatting) {
mFormatting = true;
// using US or RU formatting...
if(mAfter!=0) // in case back space ain't clicked...
{
String num =s.toString();
String data = PhoneNumberUtils.formatNumber(num, "RU");
if(data!=null)
{
s.clear();
s.append(data);
Log.i("Number", data);//8 (999) 123-45-67 or +7 999 123-45-67
}
}
mFormatting = false;
}
}
};