基于推文长度

时间:2015-06-10 19:43:22

标签: java android twitter

我试图弄清楚如何将编辑文本字段限制为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;
    }
}

}

2 个答案:

答案 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;
    }
}