仅限Android字母数字,编程方式(非XML)

仅限Android字母数字,编程方式(非XML),android,autocompletetextview,alphanumeric,programmatically,android-inputtype,Android,Autocompletetextview,Alphanumeric,Programmatically,Android Inputtype,我有一个Android程序,有一个名为aCTVNumeroPoste的AutoCompleteTextView 此AutoCompleteTextView更改输入类型取决于其他选项 因此,选项1使AutoCompleteTextView只显示文本,选项2使AutoCompleteTextView只显示数字。这似乎与键盘配合得很好 但问题是,当AutoCompleteTextView是文本时,我只需要字母数字,键盘允许我引入$%&/()=?!-。等 代码如下: if (accion.equals(

我有一个Android程序,有一个名为aCTVNumeroPoste的AutoCompleteTextView

此AutoCompleteTextView更改输入类型取决于其他选项

因此,选项1使AutoCompleteTextView只显示文本,选项2使AutoCompleteTextView只显示数字。这似乎与键盘配合得很好

但问题是,当AutoCompleteTextView是文本时,我只需要字母数字,键盘允许我引入$%&/()=?!-。

代码如下:

if (accion.equals("MANTENIMIENTO")) {
        aCTVNumeroPoste.setInputType(InputType.TYPE_CLASS_TEXT);
        int maxLengthofEditText = 19;
        aCTVNumeroPoste.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLengthofEditText)});

    }
    else {
        aCTVNumeroPoste.setInputType(InputType.TYPE_CLASS_NUMBER);
        aCTVNumeroPoste.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
        int maxLengthofEditText = 3;
        aCTVNumeroPoste.setFilters(new InputFilter[] {new InputFilter.LengthFilter(maxLengthofEditText)});
    }
我希望以编程方式解决这个问题,而不是用XML(使用android:digits=…)

我尝试在输入类型后使用此代码。键入\u CLASS\u TEXT

aCTVNumeroPoste.setFilters(new InputFilter[]{
                new InputFilter() {
                    public CharSequence filter(CharSequence src, int start,
                                               int end, Spanned dst, int dstart, int dend) {
                        if (src.equals("")) {
                            return src;
                        }
                        if (src.toString().matches("[a-zA-Z 0-9]+")) {
                            return src;
                        }
                        return "";
                    }
                }
        });
// Apply the filters to control the input (alphanumeric)
        ArrayList<InputFilter> curInputFilters = new ArrayList<InputFilter>(Arrays.asList(aCTVNumeroPoste.getFilters()));
        curInputFilters.add(0, new AlphaNumericInputFilter());
        curInputFilters.add(1, new InputFilter.LengthFilter(maxLengthofEditText));
        InputFilter[] newInputFilters = curInputFilters.toArray(new InputFilter[curInputFilters.size()]);
        aCTVNumeroPoste.setFilters(newInputFilters);
还有这个:

aCTVNumeroPoste.setKeyListener(DigitsKeyListener.getInstance("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "));

但是什么都没用。任何帮助都是值得的。

我回答我自己的问题

从这篇文章

此代码适用于我:

public static class AlphaNumericInputFilter implements InputFilter {
    public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend) {

        // Only keep characters that are alphanumeric
        StringBuilder builder = new StringBuilder();
        for (int i = start; i < end; i++) {
            char c = source.charAt(i);
            if (Character.isLetterOrDigit(c)) {
                builder.append(c);
            }
        }

        // If all characters are valid, return null, otherwise only return the filtered characters
        boolean allCharactersValid = (builder.length() == end - start);
        return allCharactersValid ? null : builder.toString();
    }
}
公共静态类AlphaNumericiInputFilter实现InputFilter{
公共CharSequence筛选器(CharSequence源、int开始、int结束、,
跨越目的地、内部数据起点、内部数据起点){
//仅保留字母数字字符
StringBuilder=新的StringBuilder();
for(int i=start;i
然后将其添加到InputType之后。键入\u CLASS\u TEXT:

aCTVNumeroPoste.setFilters(new InputFilter[]{
                new InputFilter() {
                    public CharSequence filter(CharSequence src, int start,
                                               int end, Spanned dst, int dstart, int dend) {
                        if (src.equals("")) {
                            return src;
                        }
                        if (src.toString().matches("[a-zA-Z 0-9]+")) {
                            return src;
                        }
                        return "";
                    }
                }
        });
// Apply the filters to control the input (alphanumeric)
        ArrayList<InputFilter> curInputFilters = new ArrayList<InputFilter>(Arrays.asList(aCTVNumeroPoste.getFilters()));
        curInputFilters.add(0, new AlphaNumericInputFilter());
        curInputFilters.add(1, new InputFilter.LengthFilter(maxLengthofEditText));
        InputFilter[] newInputFilters = curInputFilters.toArray(new InputFilter[curInputFilters.size()]);
        aCTVNumeroPoste.setFilters(newInputFilters);
//应用过滤器控制输入(字母数字)
ArrayList curInputFilters=新的ArrayList(Arrays.asList(aCTVNumeroPoste.getFilters());
添加(0,新的AlphaNumericInputFilter());
添加(1,新的InputFilter.LengthFilter(MaxLengthToFeditText));
InputFilter[]newInputFilters=curInputFilters.toArray(新的InputFilter[curInputFilters.size());
aCTVNumeroPoste.setFilters(新输入过滤器);