【问题标题】:How to replace the comma with a space when I use the "MultiAutoCompleteTextView"使用“MultiAutoCompleteTextView”时如何用空格替换逗号
【发布时间】:2011-03-29 19:40:11
【问题描述】:

我正在做一个简单的程序,使用MultiAutoCompleteTextView 在我输入几个字母时提示常用词。

代码:

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(
            this,
            android.R.layout.simple_dropdown_item_1line, 
            ary);
    MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.editText);
    textView.setAdapter(adapter);

    textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());

    private String[] ary = new String[] {
       "abc",
       "abcd",
       "abcde",
       "abcdef",
       "abcdefg",
       "hij",
       "hijk",
       "hijkl",
       "hijklm",
       "hijklmn",
    };

现在,当我输入 'a' 并选择 "abcd" 但结果变为“abcd”。如何用空格替换逗号?

谢谢!

【问题讨论】:

    标签: android android-widget multiautocompletetextview


    【解决方案1】:
    public class SpaceTokenizer implements Tokenizer {
    
    public int findTokenStart(CharSequence text, int cursor) {
    int i = cursor;
    
    while (i > 0 && text.charAt(i - 1) != ' ') {
        i--;
    }
    while (i < cursor && text.charAt(i) == ' ') {
        i++;
    }
    
    return i;
    }
    
    public int findTokenEnd(CharSequence text, int cursor) {
    int i = cursor;
    int len = text.length();
    
    while (i < len) {
        if (text.charAt(i) == ' ') {
            return i;
        } else {
            i++;
        }
    }
    
    return len;
    }
    
    public CharSequence terminateToken(CharSequence text) {
    int i = text.length();
    
    while (i > 0 && text.charAt(i - 1) == ' ') {
        i--;
    }
    
    if (i > 0 && text.charAt(i - 1) == ' ') {
        return text;
    } else {
        if (text instanceof Spanned) {
            SpannableString sp = new SpannableString(text + " ");
            TextUtils.copySpansFrom((Spanned) text, 0, text.length(),
                    Object.class, sp, 0);
            return sp;
        } else {
            return text + " ";
        }
    }
    }
    }
    

    【讨论】:

    • 我在这里做类似的事情!! stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader
    • findTokenStart 中,您向后迭代,然后向前迭代......看起来像一次?为什么要这样做?
    • 您可能应该使用 Character.isWhitespace 而不是与 ' ' 进行比较,这样它可以与换行符和制表符等一起使用
    • 在哪里上课?
    • 这样称呼 mactv.setTokenizer(new SpaceTokenizer());
    【解决方案2】:

    实现它的方法是实现您自己的Tokenizer。出现逗号的原因是因为您使用的是CommaTokenizer,它的设计目的就是为了做到这一点。如果您需要有关如何实现自己的 SpaceTokenizer 的参考,也可以查看 the source code for CommaTokenizer

    【讨论】:

    • 哦,谢谢。但是当我包含“MultiAutoCompleteTextView.java”时,我遇到一个错误“com.android.internal.R 无法解析”,我找不到这个文件...
    • Tokenizer 链接已损坏。
    • @Daniel,你能更新分词器源代码的链接吗?链接已损坏。
    【解决方案3】:

    检查我的问题/答案

    How to replace MultiAutoCompleteTextView drop down list

    你会发现一个 SpaceTokenizer 类

    【讨论】:

    • 是否可以在不使用标记器的情况下实现这一点?我的意思是,例如,如果我不想要任何逗号或空格作为标记器,那么可扩展功能会按原样工作吗?
    • 您可以使用您想要的任何字符更改分隔符值。不知道您不想使用分词器的原因,但是您可以根据需要删除分词器实例。
    • 我更改为空格标记器,但如果我的字符串(在多自动完整文本视图中)已经包含空格。例如人名,那么我是否需要使用其他标记器或空间在这个场景中也可以正常工作?
    • 在这种情况下 SpaceTokenizer 将无法工作。你必须用更聪明的行为实现你自己的分词器。
    【解决方案4】:

    我使用 Kotlin 作为空白标记器。这也适用于制表符、尾随空格和换行符。

    object : Tokenizer {
                override fun findTokenStart(text: CharSequence, cursor: Int): Int {
                    val spaceIndex = text.indexOfFirst { Character.isWhitespace(it) }
                    return if (spaceIndex > cursor)
                        spaceIndex
                    else cursor
                }
    
                override fun findTokenEnd(text: CharSequence, cursor: Int): Int {
                    val lastSpaceIndex = text.indexOfLast { Character.isWhitespace(it) }
                    return if (lastSpaceIndex > cursor)
                        lastSpaceIndex
                    else cursor
                }
    
                override fun terminateToken(text: CharSequence): CharSequence {
                    val i = text.length
    
                    return if (i > 0 && text[i - 1] == ' ') {
                        text
                    } else {
                        if (text is Spanned) {
                            val sp = SpannableString("$text ")
                            TextUtils.copySpansFrom(
                                text as Spanned?, 0, text.length,
                                Any::class.java, sp, 0
                            )
                            sp
                        } else {
                            "$text "
                        }
                    }
                }
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      相关资源
      最近更新 更多