0

我已经实现了 MultiAutoCompleteTextView 并且一切正常,但现在我想在用户按下建议单词的第一个字符的任何时候提出建议。基本上,建议出现在文本的开头以及文本中的最后一个字符是“,”时

所以,这是我的单词表:

{"/Bag","/Carton","/Kg","/20cm"}

如果用户按下以下内容,我希望出现建议:567/

我已经尝试在我的自定义类中覆盖 enoughFilter() ,如下所示:

public static Tokenizer mTokenizer = new MultiAutoCompleteTextView.CommaTokenizer();

@Override
    public boolean enoughToFilter() {
        Editable text = getText();
        
        int end = getSelectionEnd();
        if (end < 0 || mTokenizer == null) {
            return false;
        }
        int start = mTokenizer.findTokenStart(text, end);
        if (end - start >= getThreshold() || text.charAt(text.length()-1) == '/') {
            return true;
        } else {
            return false;
        }
    }

但这根本不起作用,它会使我的代码崩溃。有这个想法的人吗?

4

1 回答 1

0

最后,我能够通过在我的自定义类中覆盖enoughFilter()performFiltering()replaceText()来实现这一点。

因此,对于任何想要实现类似功能的人,请查看下面的代码:

public class MyAutoCompleteEdittext extends MultiAutoCompleteTextView
{
    public static Tokenizer mTokenizer = new MultiAutoCompleteTextView.CommaTokenizer();
    
    public MyAutoCompleteEdittext(Context context){
        super(context);
    }
    public MyAutoCompleteEdittext(Context context, AttributeSet attrs){
        super(context,attrs);
    }
    public MyAutoCompleteEdittext(Context context, AttributeSet attrs,int defStyle ){
        super(context,attrs,defStyle);
    }
    
    @Override
    public boolean enoughToFilter() {
        String subText = getText().toString().substring(0,getSelectionEnd());
        if(subText.contains("/"))
            return true;
        return false;
    }
    
    @Override
    protected void performFiltering(CharSequence text, int start, int end, int keyCode)
    {
        super.performFiltering(text,findTokenStart(text.toString(),end),end,0);
    }
    
    @Override
    protected void replaceText(CharSequence text) {
        clearComposingText();
        Editable editable = getText();
        int end = getSelectionEnd();
        int start = findTokenStart(editable.toString(),end);
        String original = TextUtils.substring(editable, start, end);
        QwertyKeyListener.markAsReplaced(editable, start, end, original);
        editable.replace(start, end, mTokenizer.terminateToken(text));
    }
    
    private int findTokenStart(String allText, int end){
        return allText.substring(0,end).lastIndexOf("/");
    }
    
}

如果您想要更多定制,请在此处查看源代码。这对我很有帮助。

于 2020-09-25T20:02:26.173 回答