TextHatcherでGoogleのlibphonenumberのAsYouTypeFormatterを使用しようとしていますが、可能かどうかはわかりません。 EditTextフィールドから入力したテキストを書式設定し、別のEditTextで出力することはできましたが、元のEditTextフィールドを直接変更することはできませんでした(これは私が欲しいものです)。私はphoneNumberFormattingTextWatcherについて知っていますが、ユーザーは最終的には自分がどのロケールを使用しているかを選択し、それを使用するよりも(私が収集したものから)可能にします。Android AppでAsYouTypeFormatter TextWatcherを使用するにはどうすればよいですか?
クラスのトップ:
private View phoneNumberView;
private EditText phoneNumberText;
private String formattedPhoneNumber;
private boolean isInAfterTextChanged;
private AsYouTypeFormatter aytf;
まず、私は私のクラスの先頭にAsYouTypeFormatterを初期化:
aytf = PhoneNumberUtil.getInstance().getAsYouTypeFormatter(Locale.getDefault().getCountry());
私のタブと、そのようなを作成した後、私はのEditTextボックスを作成し、フォーマットしますその中の既存の電話番号(動作している)を削除し、リスナー(現在のクラス)を添付します:
phoneNumberView = inflater.inflate(R.layout.phone_number_setting, null);
phoneNumberText = (EditText) phoneNumberView.findViewById(R.id.dirty_phone_number);
phoneNumberText.setText(dirtyPhoneNumber);
for (int i = 0; i < dirtyPhoneNumber.length(); i++){
phoneNumberText.setText(aytf.inputDigit(dirtyPhoneNumber.charAt(i)));
}
aytf.clear();
phoneNumberText.setText(dirtyPhoneNumber);
phoneNumberText.addTextChangedListener(this);
そして、これは私がこれらの機能の一つは、私のコードは、しかしであるべきであることを確認していない、私は私のTextWatcher機能で、現時点では持っているものである:ここでは
@Override
public void afterTextChanged(Editable s) {
if (!isInAfterTextChanged) {
isInAfterTextChanged = true;
if(s.length() > 0){
Log.v("AsYouTypeFormatter - source", s.toString());
for(int i = 0; i < s.length(); i++){
formattedPhoneNumber = aytf.inputDigit(s.charAt(i));
Log.v("AsYouTypeFormatter - formatted", formattedPhoneNumber);
}
Log.v("AsYouTypeFormatter - source after loop", s.toString());
//The formatted output shows properly in this EditText but not when I try to put it back into the original one (phoneNumberText)
EditText testPhoneNumberText = (EditText) phoneNumberView.findViewById(R.id.testPhoneNumberText);
testPhoneNumberText.setText(formattedPhoneNumber);
aytf.clear();
}
formattedPhoneNumber = null;
isInAfterTextChanged = false;
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
は、ログインして出力のサンプルですので、私は知っていますフォーマットが働いている:
01-03 10:55:02.838: V/AsYouTypeFormatter - source(27114): 15552451234
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 1
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 15
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 1 55
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 1 555
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 1 555-2
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 1 555-24
01-03 10:55:02.850: V/AsYouTypeFormatter - formatted(27114): 1 555-245
01-03 10:55:02.850: V/AsYouTypeFormatter - formatted(27114): 1 555-245-1
01-03 10:55:02.850: V/AsYouTypeFormatter - formatted(27114): 1 555-245-12
01-03 10:55:02.850: V/AsYouTypeFormatter - formatted(27114): 1 555-245-123
01-03 10:55:02.850: V/AsYouTypeFormatter - formatted(27114): 1 555-245-1234
01-03 10:55:02.850: V/AsYouTypeFormatter - source after loop(27114): 15552451234
そして、ここでは、出力の画像は、(上のEditTextがphoneNumberTextと底がtestPhoneNumberTextである)である:http://imgur.com/GXwRu.png
私が知りたいことは、私は戻ってフォーマットされた出力を得るのですかあります原点にそれが入力されているように、私はEditText?私がそれをやろうとすると、奇妙なことが複製のように起こるか、それともフォーマットされていないことが示されます。 s.replace()を使ってみましたが、正しく使用しているかどうかはわかりません。これは可能ですか?ありがとう?そして、これに私のコードを変更する
private String unformattedPhoneNumber;
:
@Override
public void afterTextChanged(Editable s) {
if (!isInAfterTextChanged) {
isInAfterTextChanged = true;
if(s.length() > 0){
Log.v("AsYouTypeFormatter - source", s.toString());
unformattedPhoneNumber = s.toString().replaceAll("[^\\d.]", "");
for(int i = 0; i < unformattedPhoneNumber.length(); i++){
formattedPhoneNumber = aytf.inputDigit(unformattedPhoneNumber.charAt(i));
Log.v("AsYouTypeFormatter - formatted", formattedPhoneNumber);
}
Log.v("AsYouTypeFormatter - source after loop", s.toString());
phoneNumberText.setText(formattedPhoneNumber);
aytf.clear();
}
formattedPhoneNumber = null;
isInAfterTextChanged = false;
}
}
aytfができなかったようだ
だけPhoneNumberFormattingTextWatcherを使用しないのはなぜ( String countryCode)??? http://stackoverflow.com/a/29109236/1103584 – DiscDev
minSdkVersionが必要です21 –