我正在开发一个Android应用程序,我想在其中设置输入过滤器,以便在EditText中只允许21个字符。
我使用的XML代码片段如下
<EditText
android:id="@+id/screen_name"
android:layout_width="300dp"
android:layout_height="match_parent"
android:background="#00000000"
android:enabled="false"
android:gravity="center"
android:hint="Enter your screen name"
android:maxLength="21"
android:text="Raghunathan KE"
android:textColor="#fff"
android:textSize="24sp"
android:textStyle="bold"
android:inputType="text"
android:isScrollContainer="true"
android:focusable="true"/>
而且,在活动中,
InputFilter lengthFilter = new InputFilter.LengthFilter(21) {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (dest.length() > getMax()) {
Toast.makeText(Profile.this, "Screen name should not exceeed more than 21 characters", Toast.LENGTH_LONG).show();
}
return super.filter(source, start, end, dest, dstart, dend);
}
@Override
public int getMax() {
return super.getMax();
}
};
screenname.setInputFilters(new InputFilter[]{lengthFilter});
不允许输入超过21个字符,但是我无法向用户暗示长度不得超过21个字符,因为Toast
回调中的filter
消息是没有显示。
我已尝试使用TextWatcher
,但在第21个字符后未调用,因为我已使用InputFilter
将限制设置为21。
任何人,请帮我找到解决方案。
答案 0 :(得分:1)
感谢您的所有回复。我终于在ADM的评论的帮助下找到了解决方法。
刚刚将dest.length() > getMax()
更改为dest.length() == getMax()
经过上述修改后,当我使用退格键清除一个角色时,仍会显示toast。
经过少量分析后,我发现source
返回用户键入的字符,dest
返回EditText
中显示的字符。在InputFilter
之前调用TextWatcher
时,dest
会在用户选择退格时返回相同的长度。
通过添加另一个验证来检查源的长度是否大于目标长度
dest.length() == getMax() && dest.toString().length() < source.toString().length()
最后,代码段变为
InputFilter lengthFilter = new InputFilter.LengthFilter(21) {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (dest.length() == getMax() && dest.toString().length() < source.toString().length()) {
Toast.makeText(Profile.this, "Screen name should not exceeed more than 21 characters", Toast.LENGTH_SHORT).show();
}
return super.filter(source, start, end, dest, dstart, dend);
}
@Override
public int getMax() {
return super.getMax();
}
};
更新
当dest中的数字很高时,有一种奇怪的行为 Ex:testname123456testname 。 source
有时只返回我键入的字符,当它的数字为零或者较小时。否则,它会返回完整的字符以及我刚刚键入的字符。
dest.toString().length() < source.toString().length()
在第二种情况下返回false
。
因此,代码更新为
private InputFilter.LengthFilter lengthFilter = new InputFilter.LengthFilter(maxLengthOfScreenName) {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String numbers = dest.toString().replaceAll("[^0-9]", "");
if (dest.toString().length() == maxLengthOfScreenName && ((dest.toString().length() < source.toString().length())
|| (source.toString().length() == 1 && numbers.length() > 1))) {
Toast.makeText(Profile.this,
"Screen name should not exceed more than " + maxLengthOfScreenName + " characters",
Toast.LENGTH_SHORT).show();
}
return super.filter(source, start, end, dest, dstart, dend);
}
};
希望这会帮助别人。
答案 1 :(得分:0)
尝试使用此代码,同时将edittext的最大长度保持为21 xml
yourEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if(count >= 21){
Toast.makeText(context, "Your Alert",
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
}
});