我正在制作一个简单的地址簿应用程序(目标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()每次更改其内容时都必须调用.
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)
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)
小智 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值而不是true值getText.
如果您只对国际号码感兴趣并且希望能够显示与输入中的国家/地区代码相匹配的国家/地区的国旗,我为此编写了一个小型库:
https://github.com/tfcporciuncula/phonemoji
它看起来是这样的:
| 归档时间: |
|
| 查看次数: |
105146 次 |
| 最近记录: |