电话号码格式化Android中的EditText

Bac*_*aby 57 android

我正在制作一个简单的地址簿应用程序(目标4.2),它采用名称,地址,城市,州,邮编和电话.

我想将电话号码输入格式化为电话号码(XXX)XXX-XXXX,但我需要将值作为字符串拉出来,以便在保存时将其存储在我的数据库中.我怎样才能做到这一点??我将EditText设置为"电话号码"输入,但显然不会做太多.

Sam*_*Sam 86

只需使用PhoneNumberFormattingTextWatcher,只需调用:

editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
Run Code Online (Sandbox Code Playgroud)

另外
要明确,PhoneNumberFormattingTextWatcher的主干是PhoneNumberUtils类.区别在于TextWatcher维护EditText,而PhoneNumberUtils.formatNumber()每次更改其内容时都必须调用.

  • 我是这样尝试的,但它没有将文本设置为 (XXX) XXX-XXXX 的格式。它的允许格式如 xxx-xxx-xxxx (4认同)

Tri*_*mon 53

有一个名为PhoneNumberUtils的库可以帮助您应对电话号码转换和比较.例如,使用......

EditText text = (EditText) findViewById(R.id.editTextId);
PhoneNumberUtils.formatNumber(text.getText().toString())
Run Code Online (Sandbox Code Playgroud)

...以标准格式格式化您的号码.

PhoneNumberUtils.compare(String a, String b);
Run Code Online (Sandbox Code Playgroud)

...有助于模糊比较.还有很多.查看http://developer.android.com/reference/android/telephony/PhoneNumberUtils.html了解更多信息.

ps设置EditText phone已经是一个不错的选择; 最终,digits在你的布局中添加它看起来像是有帮助的......

<EditText
    android:id="@+id/editTextId"
    android:inputType="phone"
    android:digits="0123456789+" 
/> 
Run Code Online (Sandbox Code Playgroud)

  • PhoneNumberUtils是PhoneNumberFormattingTextWatcher背后的类,所以我们有相同的基本答案.不同之处在于,当TextWatcher不断更新时,您的方法是一次性的.(+1为你.)但你为什么使用输入类型_和_数字? (2认同)

SAN*_*NAT 23

只需使用此:

在Java代码中:

editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
Run Code Online (Sandbox Code Playgroud)

在XML代码中:

<EditText
    android:id="@+id/etPhoneNumber"
    android:inputType="phone"/>
Run Code Online (Sandbox Code Playgroud)

这段代码对我有用.在编辑文本中更改文本时,它将自动格式化.


Sam*_*yay 19

我最近做了类似的格式,如1(XXX)XXX-XXXX for Android EditText.请在下面找到代码.只需使用TextWatcher子类作为文本更改的侦听器:....

UsPhoneNumberFormatter addLineNumberFormatter = new UsPhoneNumberFormatter(
            new WeakReference<EditText>(mYourEditText));
    mYourEditText.addTextChangedListener(addLineNumberFormatter);
Run Code Online (Sandbox Code Playgroud)

...

private class UsPhoneNumberFormatter implements TextWatcher {
    //This TextWatcher sub-class formats entered numbers as 1 (123) 456-7890
    private boolean mFormatting; // this is a flag which prevents the
                                    // stack(onTextChanged)
    private boolean clearFlag;
    private int mLastStartLocation;
    private String mLastBeforeText;
    private WeakReference<EditText> mWeakEditText;

    public UsPhoneNumberFormatter(WeakReference<EditText> weakEditText) {
        this.mWeakEditText = weakEditText;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
        if (after == 0 && s.toString().equals("1 ")) {
            clearFlag = true;
        }
        mLastStartLocation = start;
        mLastBeforeText = s.toString();
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        // TODO: Do nothing
    }

    @Override
    public void afterTextChanged(Editable s) {
        // Make sure to ignore calls to afterTextChanged caused by the work
        // done below
        if (!mFormatting) {
            mFormatting = true;
            int curPos = mLastStartLocation;
            String beforeValue = mLastBeforeText;
            String currentValue = s.toString();
            String formattedValue = formatUsNumber(s);
            if (currentValue.length() > beforeValue.length()) {
                int setCusorPos = formattedValue.length()
                        - (beforeValue.length() - curPos);
                mWeakEditText.get().setSelection(setCusorPos < 0 ? 0 : setCusorPos);
            } else {
                int setCusorPos = formattedValue.length()
                        - (currentValue.length() - curPos);
                if(setCusorPos > 0 && !Character.isDigit(formattedValue.charAt(setCusorPos -1))){
                    setCusorPos--;
                }
                mWeakEditText.get().setSelection(setCusorPos < 0 ? 0 : setCusorPos);
            }
            mFormatting = false;
        }
    }

    private String formatUsNumber(Editable text) {
        StringBuilder formattedString = new StringBuilder();
        // Remove everything except digits
        int p = 0;
        while (p < text.length()) {
            char ch = text.charAt(p);
            if (!Character.isDigit(ch)) {
                text.delete(p, p + 1);
            } else {
                p++;
            }
        }
        // Now only digits are remaining
        String allDigitString = text.toString();

        int totalDigitCount = allDigitString.length();

        if (totalDigitCount == 0
                || (totalDigitCount > 10 && !allDigitString.startsWith("1"))
                || totalDigitCount > 11) {
            // May be the total length of input length is greater than the
            // expected value so we'll remove all formatting
            text.clear();
            text.append(allDigitString);
            return allDigitString;
        }
        int alreadyPlacedDigitCount = 0;
        // Only '1' is remaining and user pressed backspace and so we clear
        // the edit text.
        if (allDigitString.equals("1") && clearFlag) {
            text.clear();
            clearFlag = false;
            return "";
        }
        if (allDigitString.startsWith("1")) {
            formattedString.append("1 ");
            alreadyPlacedDigitCount++;
        }
        // The first 3 numbers beyond '1' must be enclosed in brackets "()"
        if (totalDigitCount - alreadyPlacedDigitCount > 3) {
            formattedString.append("("
                    + allDigitString.substring(alreadyPlacedDigitCount,
                            alreadyPlacedDigitCount + 3) + ") ");
            alreadyPlacedDigitCount += 3;
        }
        // There must be a '-' inserted after the next 3 numbers
        if (totalDigitCount - alreadyPlacedDigitCount > 3) {
            formattedString.append(allDigitString.substring(
                    alreadyPlacedDigitCount, alreadyPlacedDigitCount + 3)
                    + "-");
            alreadyPlacedDigitCount += 3;
        }
        // All the required formatting is done so we'll just copy the
        // remaining digits.
        if (totalDigitCount > alreadyPlacedDigitCount) {
            formattedString.append(allDigitString
                    .substring(alreadyPlacedDigitCount));
        }

        text.clear();
        text.append(formattedString.toString());
        return formattedString.toString();
    }

}
Run Code Online (Sandbox Code Playgroud)

  • @samik我收到此错误java.lang.IndexOutOfBoundsException:setSpan(2 ... 2)结束超过长度1 (4认同)

小智 11

您需要创建一个类:

public class PhoneTextFormatter implements TextWatcher {

    private final String TAG = this.getClass().getSimpleName();

    private EditText mEditText;

    private String mPattern;

    public PhoneTextFormatter(EditText editText, String pattern) {
        mEditText = editText;
        mPattern = pattern;
        //set max length of string
        int maxLength = pattern.length();
        mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)});
    }

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

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        StringBuilder phone = new StringBuilder(s);

        Log.d(TAG, "join");

        if (count > 0 && !isValid(phone.toString())) {
            for (int i = 0; i < phone.length(); i++) {
                Log.d(TAG, String.format("%s", phone));
                char c = mPattern.charAt(i);

                if ((c != '#') && (c != phone.charAt(i))) {
                    phone.insert(i, c);
                }
            }

            mEditText.setText(phone);
            mEditText.setSelection(mEditText.getText().length());
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }

    private boolean isValid(String phone)
    {
        for (int i = 0; i < phone.length(); i++) {
            char c = mPattern.charAt(i);

            if (c == '#') continue;

            if (c != phone.charAt(i)) {
                return false;
            }
        }

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用方法如下:

phone = view.findViewById(R.id.phone);
phone.addTextChangedListener(new PhoneTextFormatter(phone, "+7 (###) ###-####"));
Run Code Online (Sandbox Code Playgroud)


ogu*_*han 10

也许以下示例项目可以帮助您;

https://github.com/reinaldoarrosi/MaskedEditText

该项目包含一个视图类调用MaskedEditText.首先,您应该在项目中添加它.

然后在项目的res/values/attrs.xml文件中添加下面的xml部分;

<resources>
    <declare-styleable name="MaskedEditText">
        <attr name="mask" format="string" />
        <attr name="placeholder" format="string" />
    </declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)

然后您将准备好使用MaskedEditText视图.

最后,您应该在xml文件中添加MaskedEditText,如下所示;

<packagename.currentfolder.MaskedEditText
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/maskedEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:text="5"
    app:mask="(999) 999-9999"
    app:placeholder="_" >
Run Code Online (Sandbox Code Playgroud)

当然,您可以通过编程方式使用它.

完成这些步骤后,添加MaskedEditText将如下所示;

在此输入图像描述

以编程方式,如果要将其文本值视为未屏蔽,则可以使用下面的行;

maskedEditText.getText(true);
Run Code Online (Sandbox Code Playgroud)

要获取屏蔽值,您可以在方法中发送false值而不是truegetText.


Fre*_*ula 7

如果您只对国际号码感兴趣并且希望能够显示与输入中的国家/地区代码相匹配的国家/地区的国旗,我为此编写了一个小型库:

https://github.com/tfcporciuncula/phonemoji

它看起来是这样的:

库演示