2

私のアプリケーションでは、ユーザーからの電話番号を受け入れるeditTextがあります。私のターゲットは、ユーザーが電話番号を入力するとすぐにフォーマットする必要があります(テキスト変更リスナーに適用する場合と同様)、フォーマットはのようになりXXX-XXX-XXXXます。

私はコードを次のように書きました

ePhone.addTextChangedListener(new TextWatcher() {

            private Pattern pattern;
            private Matcher matcher;
            String a;


            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub

                boolean flag = true;            
                if (flag) {

                    if (((ePhone.getText().length() + 1) % 4) == 0) 
                    {
                        if (ePhone.getText().toString().split("-").length <= 2) 
                        {
                            ePhone.setText(ePhone.getText() + "-");
                            ePhone.setSelection(ePhone.getText().length());
                        }
                    }
                    a = ePhone.getText().toString();
                } else {
                    ePhone.setText(a);
                }
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stus

            }
        });

しかし、ユーザーがこれから番号を削除したい場合editText、それは正しく機能していません。前もって感謝します。

4

3 に答える 3

8

米国の形式に従って電話番号をフォーマットしたいとします。

+1 (###) ###-####,1 (###) ###-####,###-####,###-###-####,011 $

以下はあなたの目的に役立ちます:

phoneEditText.addTextChangedListener(new TextWatcher() {
    private boolean mFormatting; // a flag that prevents stack overflows.
    private int mAfter;

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    }

    //called before the text is changed...
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        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 formatting.
            if(mAfter != 0) // in case back space ain't clicked.
                PhoneNumberUtils.formatNumber(
                    s,PhoneNumberUtils.getFormatTypeForLocale(Locale.US));
            mFormatting = false;
        }
    }
});

場所固有のサービスが必要な場合、つまり場所ごとに、その場所の特定の形式が必要です(このリンクを参照してください)。必要な形式のみが必要な場合は、上記のコードスニペットの行の代わりにカスタム関数を記述します。

PhoneNumberUtils.formatNumber(
    s, PhoneNumberUtils.getFormatTypeForLocale(Locale.US));     
于 2013-03-19T11:04:39.940 に答える
0

このコードは、削除と編集の両方で機能します。

 public class PhoneNumberFormattingTextWatcher implements TextWatcher {
EditText Edt;
int keyDel=0;
public PhoneNumberFormattingTextWatcher(EditText edt){
 Edt =edt;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

}

@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    Edt.setOnKeyListener(new View.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 = Edt.getText().length();
        String input=Edt.getText().toString();
        if(len == 4) {
            Edt.setText( input.substring(0,3)+"-"+ input.substring(3) );
            Edt.setSelection(Edt.getText().length());
        }
        if(len == 8) {
            Edt.setText( input.substring(0,7)+"-"+ input.substring(7) );
            Edt.setSelection(Edt.getText().length());
        }
    } else if(keyDel==1){
        int len = Edt.getText().length();
        if(len == 4||len==8) {
            Edt.setText(Edt.getText().delete(Edt.getText().length()-1,Edt.getText().length()) );
            Edt.setSelection(Edt.getText().length());
        }
        keyDel = 0;
    }
}

@Override
public void afterTextChanged(Editable editable) {

}

}

于 2016-10-18T18:36:16.200 に答える