use*_*611 5 android android-edittext input-filter
当我setFilter在a EditText上使用方法来处理特殊字符时,maxLength属性不能按预期工作.我的代码如下.
editName = (EditText)findViewById(R.id.rna_editTextName);
editName.setFilters(new InputFilter[]{getFilteredChars()});
//Below method returns filtered characters.
public InputFilter getFilteredChars()
{
InputFilter filter = new InputFilter()
{
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (end > start) {
char[] acceptedChars = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ' ,'.', '\''};
for (int index = start; index < end; index++) {
if (!new String(acceptedChars).contains(String.valueOf(source.charAt(index)))) {
return "";
}
}
}
return null;
}
};
return filter;
}
Run Code Online (Sandbox Code Playgroud)
Joz*_*zua 14
这是因为该maxLength物业设置了InputFilter你的EditText.通过调用,EditText.setFilters(new InputFilter[] {<YOUR_FILTER>})您将覆盖所有现有的InputFilters,包括使用的那个maxLength.
要解决此问题,请复制返回的数组EditText.getFilters()并将其添加到其中:
InputFilter[] editFilters = edit.getFilters();
InputFilter[] newFilters = new InputFilter[editFilters.length + 1];
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
newFilters[editFilters.length] = <YOUR_FILTER>;
edit.setFilters(newFilters);
Run Code Online (Sandbox Code Playgroud)
试试这个代码。基于@Jozua的答案
/**
* Adds filter to EditText preserving other filters.
*
* @param editText
* @param filter
*/
public static void setFilter(EditText editText, InputFilter filter) {
InputFilter curFilters[] = editText.getFilters();
if (curFilters != null) {
InputFilter newFilters[] = new InputFilter[curFilters.length + 1];
System.arraycopy(curFilters, 0, newFilters, 0, curFilters.length);
newFilters[curFilters.length] = filter;
editText.setFilters(newFilters);
} else {
editText.setFilters(new InputFilter[] { filter });
}
}
Run Code Online (Sandbox Code Playgroud)
\n\n\n以编程方式设置 edittext 的 maxlenth 属性时
\n
请显示使用代码。
\n\n大胆猜测:问题可能是您在布局中设置了 maxLength。通过调用 setFilters(),此行为将被替换为您的 Filter 之一。
\n\n解决方案:\n使用多个过滤器或在 getFilteredChars() 过滤器中实现 maxLenght 行为。
\n\n编辑:\n您可能想查看http://developer.android.com/reference/android/text/InputFilter.LengthFilter.html
\n\n对于您在评论中提出的问题,\n来自文档:
\n\nwhen the buffer is going to replace the range dstart \xe2\x80\xa6 dend of dest with the new text from the range start \xe2\x80\xa6 end of source\nRun Code Online (Sandbox Code Playgroud)\n\n所以,类似(伪代码 liveCoding):
\n\ndest.lenght - (dend-dstart) + (end-start) = new legnth\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2769 次 |
| 最近记录: |