Telefoonnummer Formatteren van een EditTekst in Android

Ik maak een eenvoudige adresboek-app (targeting 4.2) die naam, adres, stad, staat, rits en telefoon nodig acht.

Ik wil het telefoonnummer invoeren als een telefoonnummer (XXX) XXX-XXXX, maar ik moet de waarde uithalen als een string, zodat ik het in mijn database kan opslaan wanneer ik opslaat. Hoe kan ik dit doen??
Ik heb de EditTekst ingesteld op “Telefoonnummer” -invoer, maar dat doet u natuurlijk niet te veel.


Antwoord 1, Autoriteit 100%

Gebruik eenvoudig de phonenumberformattingtextwatcher , bel gewoon:

editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher());

addition
Om duidelijk te zijn, de PhonenumberformattingTextWatcher’s Backbone is de klasse Phonenumbutils. Het verschil is dat de tekstwatcher de EditTekst onderhoudt, terwijl u PhoneNumberUtils.formatNumber()moet bellen telkens wanneer u de inhoud van de inhoud wijzigt.


Antwoord 2, Autoriteit 59%

Er is een bibliotheek genaamd phonenumbutils die u kan helpen om het hoofd te bieden met telefoonnummerconversies en vergelijkingen. Gebruik bijvoorbeeld …

EditText text = (EditText) findViewById(R.id.editTextId);
PhoneNumberUtils.formatNumber(text.getText().toString())

… om uw nummer in een standaardformaat te formatteren.

PhoneNumberUtils.compare(String a, String b);

… helpt bij fuzzy-vergelijkingen. Er zijn nog veel meer. Uitchecken http://develder.android.com/reference/android/telephony/phonenumbutils .html voor meer.

P.S. De EditText instellen op phoneis al een goede keuze; Uiteindelijk kan het nuttig zijn om digitsb.v. toe te voegen In je lay-out lijkt het als …

<EditText
    android:id="@+id/editTextId"
    android:inputType="phone"
    android:digits="0123456789+" 
/> 

Antwoord 3, Autoriteit 30%

Gebruik dit gewoon:

In Java Code:

editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher());

In XML-code:

<EditText
    android:id="@+id/etPhoneNumber"
    android:inputType="phone"/>

Deze code werkt voor mij. Het zal automatisch formatteren wanneer tekst wordt gewijzigd in de tekst bewerken.


Antwoord 4, Autoriteit 21%

Ik heb onlangs een vergelijkbare opmaak gedaan zoals 1 (xxx) XXX-XXXX voor Android EditText. Zoek de onderstaande code. Gebruik gewoon de Sub-Class van de tekstwatcher als de tekst van Listener veranderde:
….

UsPhoneNumberFormatter addLineNumberFormatter = new UsPhoneNumberFormatter(
            new WeakReference<EditText>(mYourEditText));
    mYourEditText.addTextChangedListener(addLineNumberFormatter);

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();
    }
}

Antwoord 5, autoriteit 14%

Misschien helpt onderstaand voorbeeldproject je;

https://github.com/reinaldoarrosi/MaskedEditText

Dat project bevat een view class-aanroep MaskedEditText. Als eerste, je moet het toevoegen aan je project.

Vervolgens voeg je het onderstaande xml-gedeelte toe aan het res/values/attrs.xml-bestand van het project;

<resources>
    <declare-styleable name="MaskedEditText">
        <attr name="mask" format="string" />
        <attr name="placeholder" format="string" />
    </declare-styleable>
</resources>

Dan bent u klaar om de weergave MaskedEditTextte gebruiken.

Als laatste zou je MaskedEditText in je xml-bestand moeten toevoegen zoals je hieronder wilt;

<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="_" >

Natuurlijk kun je het programmatisch gebruiken.

Na deze stappen zal het toevoegen van MaskedEditTextverschijnen zoals hieronder;

Zoals programmatisch, als u de tekstwaarde als ontmaskerd wilt nemen, kunt u onderstaande rij gebruiken;

maskedEditText.getText(true);

Als u gemaskeerde waarde wilt aannemen, kunt u de waarde falseverzenden in plaats van de waarde truemet de methode getText.


Antwoord 6, autoriteit 12%

Je moet een klas maken:

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;
    }
}

Gebruik dit als volgt:

phone = view.findViewById(R.id.phone);
phone.addTextChangedListener(new PhoneTextFormatter(phone, "+7 (###) ###-####"));

Antwoord 7, autoriteit 4%

Volg de instructies in dit antwoord om het EditText-masker op te maken.

https://stackoverflow.com/a/34907607/1013929

En daarna kun je de originele nummers van de gemaskeerde string vangen met:

String phoneNumbers = maskedString.replaceAll("[^\\d]", "");

Antwoord 8, autoriteit 3%

//(123) 456 7890  formate set
private int textlength = 0;
public class MyPhoneTextWatcher implements TextWatcher {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    }
    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        String text = etMobile.getText().toString();
        textlength = etMobile.getText().length();
        if (text.endsWith(" "))
            return;
        if (textlength == 1) {
            if (!text.contains("(")) {
                etMobile.setText(new StringBuilder(text).insert(text.length() - 1, "(").toString());
                etMobile.setSelection(etMobile.getText().length());
            }
        } else if (textlength == 5) {
            if (!text.contains(")")) {
                etMobile.setText(new StringBuilder(text).insert(text.length() - 1, ")").toString());
                etMobile.setSelection(etMobile.getText().length());
            }
        } else if (textlength == 6 || textlength == 10) {
            etMobile.setText(new StringBuilder(text).insert(text.length() - 1, " ").toString());
            etMobile.setSelection(etMobile.getText().length());
        }
    }
    @Override
    public void afterTextChanged(Editable editable) {
    }
}

Antwoord 9, autoriteit 3%

Meer zoals schoon:

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String text = etyEditText.getText();
    int textlength = etyEditText.getText().length();
    if (text.endsWith("(") ||text.endsWith(")")|| text.endsWith(" ") || text.endsWith("-")  )
                return;
    switch (textlength){
        case 1:
            etyEditText.setEditText(new StringBuilder(text).insert(text.length() - 1, "(").toString());
            etyEditText.setSelection(etyEditText.getText().length());
            break;
        case 5:
            etyEditText.setEditText(new StringBuilder(text).insert(text.length() - 1, ")").toString());
            etyEditText.setSelection(etyEditText.getText().length());
            break;
        case 6:
            etyEditText.setEditText(new StringBuilder(text).insert(text.length() - 1, " ").toString());
            etyEditText.setSelection(etyEditText.getText().length());
            break;
        case 10:
            etyEditText.setEditText(new StringBuilder(text).insert(text.length() - 1, "-").toString());
            etyEditText.setSelection(etyEditText.getText().length());
            break;
    }
}

Antwoord 10, autoriteit 2%

Je kunt een reguliere expressie met patroonovereenkomst gebruiken om een ​​getal uit een tekenreeks te halen.

   String s="";
    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher("(1111)123-456-789"); //editText.getText().toString()                                      
    while (m.find()) {
    s=s+m.group(0);
    }
    System.out.println("............"+s);    
    Output : ............1111123456789

Antwoord 11, autoriteit 2%

Als je alleen geïnteresseerd bent in internationale nummers en je wilt de vlag van het land kunnen tonen die overeenkomt met de landcode in de invoer, dan heb ik daarvoor een kleine bibliotheek geschreven:

https://github.com/tfcporciuncula/phonemoji

Zo ziet het eruit:


Antwoord 12

Maak je geen zorgen. Ik heb een betere oplossing voor je gemaakt. Je kunt deze eenvoudige app-link hieronder zien.

private EditText mPasswordField;
public int textLength = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mPasswordField = (EditText) findViewById(R.id.password_field);
    mPasswordField.addTextChangedListener(this);
}
@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 text = mPasswordField.getText().toString();
    textLength = mPasswordField.getText().length();
    if (text.endsWith("-") || text.endsWith(" ") || text.endsWith(" "))
        return;
    if (textLength == 1) {
        if (!text.contains("(")) {
            mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, "(").toString());
            mPasswordField.setSelection(mPasswordField.getText().length());
        }
    } else if (textLength == 5) {
        if (!text.contains(")")) {
            mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, ")").toString());
            mPasswordField.setSelection(mPasswordField.getText().length());
        }
    } else if (textLength == 6) {
            mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, " ").toString());
            mPasswordField.setSelection(mPasswordField.getText().length());
    } else if (textLength == 10) {
        if (!text.contains("-")) {
            mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, "-").toString());
            mPasswordField.setSelection(mPasswordField.getText().length());
        }
    } else if (textLength == 15) {
        if (text.contains("-")) {
            mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, "-").toString());
            mPasswordField.setSelection(mPasswordField.getText().length());
        }
    }else if (textLength == 18) {
        if (text.contains("-")) {
            mPasswordField.setText(new StringBuilder(text).insert(text.length() - 1, "-").toString());
            mPasswordField.setSelection(mPasswordField.getText().length());
        }
    } else if (textLength == 20) {
        Intent i = new Intent(MainActivity.this, Activity2.class);
        startActivity(i);
    }
}
@Override
public void afterTextChanged(Editable s) {
}

Niet: vergeet niet “TextWatcher implementeren” bij uw activiteitenklasse.

Link :https://drive.google.com/open?id=0B -yo9VvU7jyBMjJpT29xc2k5bnc

Ik hoop dat je je goed voelt voor deze oplossing.


Antwoord 13

Je kunt spawns gebruiken om telefoonnummers op te maken in Android. Deze oplossing is beter dan de andere omdat het de invoertekst niet verandert. Opmaak blijft puur visueel.

implementation 'com.googlecode.libphonenumber:libphonenumber:7.0.4'

Opmaakklasse:

open class PhoneNumberFormatter : TransformationMethod {
private val mFormatter: AsYouTypeFormatter = PhoneNumberUtil.getInstance().getAsYouTypeFormatter(Locale.getDefault().country)
override fun getTransformation(source: CharSequence, view: View): CharSequence {
    val formatted = format(source)
    if (source is Spannable) {
        setSpans(source, formatted)
        return source
    }
    return formatted
}
override fun onFocusChanged(view: View?, sourceText: CharSequence?, focused: Boolean, direction: Int, previouslyFocusedRect: Rect?) = Unit
private fun setSpans(spannable: Spannable, formatted: CharSequence): CharSequence {
    spannable.clearSpawns()
    var charterIndex = 0
    var formattedIndex = 0
    var spawn = ""
    val spawns: List<String> = spannable
        .map {
            spawn = ""
            charterIndex = formatted.indexOf(it, formattedIndex)
            if (charterIndex != -1){
                spawn = formatted.substring(formattedIndex, charterIndex-1)
                formattedIndex = charterIndex+1
            }
            spawn
        }
    spawns.forEachIndexed { index, sequence ->
        spannable.setSpan(CharterSpan(sequence), index, index + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
    }
    return formatted
}
private fun Spannable.clearSpawns() =
    this
        .getSpans(0, this.length, CharterSpan::class.java)
        .forEach { this.removeSpan(it) }
private fun format(spannable: CharSequence): String {
    mFormatter.clear()
    var formated = ""
    for (i in 0 until spannable.length) {
        formated = mFormatter.inputDigit(spannable[i])
    }
    return formated
}
private inner class CharterSpan(private val charters: String) : ReplacementSpan() {
    var space = 0
    override fun getSize(paint: Paint, text: CharSequence, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int {
        space = Math.round(paint.measureText(charters, 0, charters.length))
        return Math.round(paint.measureText(text, start, end)) + space
    }
    override fun draw(canvas: Canvas, text: CharSequence, start: Int, end: Int, x: Float, top: Int, y: Int, bottom: Int, paint: Paint) {
        space = Math.round(paint.measureText(charters, 0, charters.length))
        canvas.drawText(text, start, end, x + space, y.toFloat(), paint)
        canvas.drawText(charters, x, y.toFloat(), paint)
    }
    }
}

Gebruik:

editText.transformationMethod = formatter

Antwoord 14

U kunt alleen nummers en telefoonnummers accepteren met Java-code

EditText number1 = (EditText) layout.findViewById(R.id.edittext); 
    number1.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_CLASS_PHONE);
     number1.setKeyListener(DigitsKeyListener.getInstance("0123456789”));
      number1.setFilters(new InputFilter[] {new InputFilter.LengthFilter(14)}); // 14 is max digits

Deze code voorkomt veel validaties na het lezen van invoer


Antwoord 15

Deze code werkt voor mij voor (216) 555-5555

etphonenumber.addTextChangedListener(new TextWatcher()
        {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                // TODO Auto-generated method stub
            }
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {
                // TODO Auto-generated method stub
            }
            @Override
            public void afterTextChanged(Editable s)
            {
                String text = etphonenumber.getText().toString();
                int  textLength = etphonenumber.getText().length();
                if (text.endsWith("-") || text.endsWith(" ") || text.endsWith(" "))
                    return;
                if (textLength == 1) {
                    if (!text.contains("("))
                    {
                        etphonenumber.setText(new StringBuilder(text).insert(text.length() - 1, "(").toString());
                        etphonenumber.setSelection(etphonenumber.getText().length());
                    }
                }
                else if (textLength == 5)
                {
                    if (!text.contains(")"))
                    {
                        etphonenumber.setText(new StringBuilder(text).insert(text.length() - 1, ")").toString());
                        etphonenumber.setSelection(etphonenumber.getText().length());
                    }
                }
                else if (textLength == 6)
                {
                    etphonenumber.setText(new StringBuilder(text).insert(text.length() - 1, " ").toString());
                    etphonenumber.setSelection(etphonenumber.getText().length());
                }
                else if (textLength == 10)
                {
                    if (!text.contains("-"))
                    {
                        etphonenumber.setText(new StringBuilder(text).insert(text.length() - 1, "-").toString());
                        etphonenumber.setSelection(etphonenumber.getText().length());
                    }
                }
            }
        });

Other episodes