Android - 当我设置最大长度并且 android:imeOptions="actionNext" 不在键盘上显示时,TextInputEditText 接受字母表产生问题
Android - TextInputEditText accepts Alphabets produce issue when I set max length and android:imeOptions="actionNext" not show on Keyboard
我已将 TextInputEditText 用作名字,但我遇到了问题。
<android.support.design.widget.TextInputLayout
android:id="@+id/tvfnameinput"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputEditText
android:id="@+id/etFirstname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
android:hint="firstname"
android:imeOptions="actionNext"
android:maxLength="12"
android:maxLines="1"
android:text="" />
</android.support.design.widget.TextInputLayout>
正如你在上面的布局中看到的那样,我已经设置了最大长度 12,所以如果我输入了 12 个数值,那么它不接受但它是计数的,所以我无法在输入 12 个数值后输入字母。
注意-:我只想要字母,我的代码可以正常工作,但是当我输入数值时,它不被接受,但算作最大长度。
编辑-: android:imeOptions="actionNext" 当我设置 android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[= 时键盘上不显示15=]
编辑
如果您只想设置字母,则可以使用 InputFilter 而不是数字。从您的布局中删除此标记 digit
。
下面是可以帮助您的示例:
edittext.setFilters(new InputFilter[] {
new InputFilter() {
public CharSequence filter(CharSequence src, int start,
int end, Spanned dst, int dstart, int dend) {
if(src.equals("")){ // for backspace
return src;
}
if(src.toString().matches("[a-zA-Z ]+")){
return src;
}
return "";
}
}
});
试试这个。它由我自己测试并且工作起来很有魅力
editText.setFilters(new InputFilter[]{new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
boolean keepOriginal = true;
StringBuilder sb = new StringBuilder(end - start);
for (int i = start; i < end; i++) {
char c = source.charAt(i);
if (isCharAllowed(c)) // put your condition here
sb.append(c);
else
keepOriginal = false;
}
if (keepOriginal)
return null;
else {
if (source instanceof Spanned) {
SpannableString sp = new SpannableString(sb);
TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
return sp;
} else {
return sb;
}
}
}
private boolean isCharAllowed(char c) {
Pattern ps = Pattern.compile("^[a-zA-Z ]+$");
Matcher ms = ps.matcher(String.valueOf(c));
return ms.matches();
}
}});
具有 MaxLength 的输入过滤器
当使用 InputFilter 时,EditText 的 属性 被覆盖,然后您可以在 InputFiler 中使用最大长度。
试试这个
InputFilter[] inputFilters = new InputFilter[2];
inputFilters[0] = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
boolean keepOriginal = true;
StringBuilder sb = new StringBuilder(end - start);
for (int i = start; i < end; i++) {
char c = source.charAt(i);
if (isCharAllowed(c)) // put your condition here
sb.append(c);
else
keepOriginal = false;
}
if (keepOriginal)
return null;
else {
if (source instanceof Spanned) {
SpannableString sp = new SpannableString(sb);
TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
return sp;
} else {
return sb;
}
}
}
private boolean isCharAllowed(char c) {
Pattern ps = Pattern.compile("^[a-zA-Z ]+$");
Matcher ms = ps.matcher(String.valueOf(c));
return ms.matches();
}
};
inputFilters[1] = new InputFilter.LengthFilter(12);
editText.setFilters(inputFilters);
我已将 TextInputEditText 用作名字,但我遇到了问题。
<android.support.design.widget.TextInputLayout
android:id="@+id/tvfnameinput"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputEditText
android:id="@+id/etFirstname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
android:hint="firstname"
android:imeOptions="actionNext"
android:maxLength="12"
android:maxLines="1"
android:text="" />
</android.support.design.widget.TextInputLayout>
正如你在上面的布局中看到的那样,我已经设置了最大长度 12,所以如果我输入了 12 个数值,那么它不接受但它是计数的,所以我无法在输入 12 个数值后输入字母。
注意-:我只想要字母,我的代码可以正常工作,但是当我输入数值时,它不被接受,但算作最大长度。
编辑-: android:imeOptions="actionNext" 当我设置 android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[= 时键盘上不显示15=]
编辑
如果您只想设置字母,则可以使用 InputFilter 而不是数字。从您的布局中删除此标记 digit
。
下面是可以帮助您的示例:
edittext.setFilters(new InputFilter[] {
new InputFilter() {
public CharSequence filter(CharSequence src, int start,
int end, Spanned dst, int dstart, int dend) {
if(src.equals("")){ // for backspace
return src;
}
if(src.toString().matches("[a-zA-Z ]+")){
return src;
}
return "";
}
}
});
试试这个。它由我自己测试并且工作起来很有魅力
editText.setFilters(new InputFilter[]{new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
boolean keepOriginal = true;
StringBuilder sb = new StringBuilder(end - start);
for (int i = start; i < end; i++) {
char c = source.charAt(i);
if (isCharAllowed(c)) // put your condition here
sb.append(c);
else
keepOriginal = false;
}
if (keepOriginal)
return null;
else {
if (source instanceof Spanned) {
SpannableString sp = new SpannableString(sb);
TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
return sp;
} else {
return sb;
}
}
}
private boolean isCharAllowed(char c) {
Pattern ps = Pattern.compile("^[a-zA-Z ]+$");
Matcher ms = ps.matcher(String.valueOf(c));
return ms.matches();
}
}});
具有 MaxLength 的输入过滤器
当使用 InputFilter 时,EditText 的 属性 被覆盖,然后您可以在 InputFiler 中使用最大长度。
试试这个
InputFilter[] inputFilters = new InputFilter[2];
inputFilters[0] = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
boolean keepOriginal = true;
StringBuilder sb = new StringBuilder(end - start);
for (int i = start; i < end; i++) {
char c = source.charAt(i);
if (isCharAllowed(c)) // put your condition here
sb.append(c);
else
keepOriginal = false;
}
if (keepOriginal)
return null;
else {
if (source instanceof Spanned) {
SpannableString sp = new SpannableString(sb);
TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
return sp;
} else {
return sb;
}
}
}
private boolean isCharAllowed(char c) {
Pattern ps = Pattern.compile("^[a-zA-Z ]+$");
Matcher ms = ps.matcher(String.valueOf(c));
return ms.matches();
}
};
inputFilters[1] = new InputFilter.LengthFilter(12);
editText.setFilters(inputFilters);