Mask an EditText with Phone Number Format NaN like in PhoneNumberUtils

后端 未结 8 1263
广开言路
广开言路 2020-12-05 05:08

I want to make user inputted phone number in an editText to dynamically change format every time the user inputs a number. That is, when user inputs up to 4 digits, like 714

相关标签:
8条回答
  • 2020-12-05 05:33

    The above solutions do not take backspace into consideration so when you delete some numbers after typing, the format tends to mess up. Below code corrects this issue.

    phoneNumberEditText.addTextChangedListener(new TextWatcher() {
    
            int beforeLength;
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                beforeLength = phoneNumberEditText.length();
            }
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                int digits = phoneNumberEditText.getText().toString().length();
                if (beforeLength < digits && (digits == 3 || digits == 7)) {
                    phoneNumberEditText.append("-");
                }
            }
    
            @Override
            public void afterTextChanged(Editable s) { }
        });
    
    0 讨论(0)
  • 2020-12-05 05:34

    My script, example taken from here description here


    <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;
            }
        }
    };
    
    0 讨论(0)
提交回复
热议问题