我试图弄清楚如何将编辑文本字段限制为140个推特字符,而不允许用户键入限制。我以为我使用下面的代码,但是,我发现如果光标位于editText字段的末尾,它只会阻止输入。尽管我已经尝试过,但我无法弄清楚source和dest的逻辑,以及如何将它们连接到将在editText字段中显示的完整字符串。这就是我试图做的fullTextString。
请注意,这并不像限制编辑文本字段的长度那么简单。 Twitter会考虑诸如" t.co"之类的链接。作为22个字符,而不是3.我还没有看到任何其他工作示例。
快速克隆的完整示例在github上: https://github.com/tylerjroach/TwitterEditTextLengthFilter
public class TwitterLengthFilter implements InputFilter {
Validator tweetValidator = new Validator();
private final int max;
public TwitterLengthFilter(int max) {
this.max = max;
}
public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
int dstart, int dend) {
String destString = dest.subSequence(0, dstart).toString();
String sourceString = source.subSequence(start, end).toString();
String fullTextString = destString + sourceString;
if (fullTextString.length() == 0) {
return "";
} else if (tweetValidator.getTweetLength(fullTextString) <= max) {
return null; //keep original
} else {
CharSequence returnSource = "";
for (int i=0; i<sourceString.length(); i++) {
if (tweetValidator.getTweetLength(destString + source.subSequence(0, i + 1)) <= max) {
returnSource = source.subSequence(0, i + 1);
}
}
return returnSource;
}
}
}
答案 0 :(得分:0)
尝试将此添加到您的编辑文字XML:
android:maxLength="140"
答案 1 :(得分:0)
在阅读了更多关于过滤方法后,我终于能够弄明白了。我相信它可能更有效率,但它现在有用。我希望有任何建议可以让它变得更好。
当缓冲区要用源范围start ... end的新文本替换dest的范围dstart ... dend时,将调用此方法。返回您希望放置在那里的CharSequence,包括适当的空字符串,或null以接受原始替换。小心不要拒绝0长度替换,因为这是删除文本时发生的情况。还要注意,您不应尝试对此方法的dest进行任何更改;你可能只会检查它的背景。注意:如果source是Spanned或Spannable的实例,则应将源中的span对象复制到筛选结果(即非null返回值)中。 copySpansFrom(Spanned,int,int,Class,Spannable,int)可以方便使用。
public class TwitterLengthFilter implements InputFilter {
Validator tweetValidator = new Validator();
private final int max;
public TwitterLengthFilter(int max) {
this.max = max;
}
public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
int dstart, int dend) {
StringBuilder destination = new StringBuilder(dest);
String sourceString = source.subSequence(start, end).toString();
String fullTextString = destination.replace(dstart, dend, sourceString).toString();
Log.v("Full text", fullTextString);
if (fullTextString.length() == 0) {
return "";
} else if (tweetValidator.getTweetLength(fullTextString) <= max) {
return null; //keep original
} else {
CharSequence returnSource = "";
for (int i=0; i<sourceString.length(); i++) {
String iterateSource = source.subSequence(0, i + 1).toString();
StringBuilder iteratedDestination = new StringBuilder(dest);
iteratedDestination.replace(dstart, dend, iterateSource);
if (tweetValidator.getTweetLength(iteratedDestination.toString()) <= max) {
returnSource = source.subSequence(0, i + 1);
}
}
return returnSource;
}
}