4 android
我想实现这样的算法:
一旦用户开始为"MM"输入数字,在用户输入两位"MM"后应该给出"/",然后,它应该只输入"yy"的最后两位数字.我怎样才能实现这种功能?
Goo*_*ife 14
android:maxLength="5"
Run Code Online (Sandbox Code Playgroud)
并设置为editText的电话,以便它可以显示"/"
android:inputType="phone"
Run Code Online (Sandbox Code Playgroud)
在textWatcher上执行此操作....我将稍后验证正确的mm/yy月份,以避免用户输入数据,如55/66 max应为12/31,但应该在少于或30天的时间内验证数月. .
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() > 0 && (editable.length() % 3) == 0) {
final char c = editable.charAt(editable.length() - 1);
if ('/' == c) {
editable.delete(editable.length() - 1, editable.length());
}
}
if (editable.length() > 0 && (editable.length() % 3) == 0) {
char c = editable.charAt(editable.length() - 1);
if (Character.isDigit(c) && TextUtils.split(editable.toString(), String.valueOf("/")).length <= 2) {
editable.insert(editable.length() - 1, String.valueOf("/"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我只是实现了一种方法,例如 Uber 信用卡日期格式,带有自动检查、自动完成、自动移动到 CVV 编辑文本。
<EditText
android:id="@+id/credit_card_expire_et"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_weight="1"
android:hint="MM/YY"
android:inputType="number"
android:maxLength="5"
android:maxLines="1" />
<EditText
android:id="@+id/credit_card_cvv_et"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_weight="1"
android:hint="CVV"
android:inputType="number"
android:maxLength="3"
android:maxLines="1" />
Run Code Online (Sandbox Code Playgroud)
.
@BindView(R.id.credit_card_expire_et)
EditText creditExpireEt;
@BindView(R.id.credit_card_cvv_et)
EditText creditCVVEt;
@OnTextChanged(value = R.id.credit_card_expire_et, callback = BEFORE_TEXT_CHANGED)
void beforeExpireEtChanged() {
previousLength = creditExpireEt.getText().toString().length();
}
@OnTextChanged(R.id.credit_card_expire_et)
void autoFixAndMoveToNext() {
int length = creditExpireEt.getText().toString().trim().length();
if (previousLength <= length && length < 3) {
int month = Integer.parseInt(creditExpireEt.getText().toString());
if (length == 1 && month >= 2) {
String autoFixStr = "0" + month + "/";
creditExpireEt.setText(autoFixStr);
creditExpireEt.setSelection(3);
} else if (length == 2 && month <= 12) {
String autoFixStr = creditExpireEt.getText().toString() + "/";
creditExpireEt.setText(autoFixStr);
creditExpireEt.setSelection(3);
} else if (length ==2 && month > 12) {
creditExpireEt.setText("1");
creditExpireEt.setSelection(1);
}
} else if (length == 5) {
creditCVVEt.requestFocus(); // auto move to next edittext
}
}
Run Code Online (Sandbox Code Playgroud)
首先将 EditText 的最大字符数设置为 5,如下所示:
android:maxLength="5"
Run Code Online (Sandbox Code Playgroud)
并设置为数字editText
android:inputType="number"
Run Code Online (Sandbox Code Playgroud)
然后在EditText中添加一个onEditTextChangedListener来检测字符数是否从3个变为2个,如果没有,则将“/”删除:
edit_text.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(p0: Editable?) {}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
override fun onTextChanged(p0: CharSequence?, start: Int, removed: Int, added: Int) {
if (start == 1 && start+added == 2 && p0?.contains('/') == false) {
edit_text.setText(p0.toString() + "/")
} else if (start == 3 && start-removed == 2 && p0?.contains('/') == true) {
edit_text.setText(p0.toString().replace("/", ""))
}
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7623 次 |
| 最近记录: |