Android限制用户输入

时间:2014-01-31 11:12:05

标签: java android

我正在尝试限制用户输入。如果用户输入连续数字,例如1232334,连续特殊字符,例如!@%$ ^&#@ $ *。但它允许用户输入序数,如第1,第2等。而且它也将允许约翰福音13:12。一节经文。

这就是我尝试过的:(我使用了InputFilter)

 InputFilter filter = new InputFilter() { 
        @Override
        public CharSequence filter(CharSequence source, int start, int end,
                Spanned dest, int dstart, int dend) {
            // TODO Auto-generated method stub
            for (int i = start; i < end; i++) { 
                if (!Character.isLetterOrDigit(source.charAt(i))) { 
                    return ""; 
                    } 
             } 
             return null; 
        } 
    }; 

    et.setFilters(new InputFilter[]{filter}); 

但它不会让我输入特殊字符,它可以接受连续数字。有谁知道如何达到我的要求?非常感谢你。感谢。

2 个答案:

答案 0 :(得分:2)

试试这个经过测试的解决方案。

import android.app.Activity;
import android.os.Bundle;
import android.text.InputFilter;
import android.text.Spanned;
import android.widget.EditText;

public class MainActivity extends Activity {

    EditText et;
    String specialCharSet = "!@%$^&#@$*";

    InputFilter filter = new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            String tmp;
            try {
                tmp = (et.getText().toString()).substring(et.getText().toString().length() - 2, et.getText().toString().length());

                if (Character.isDigit(tmp.charAt(0)) && Character.isDigit(tmp.charAt(1)) && Character.isDigit(source.toString().charAt(0))) {
                    return "";
                }

                if (specialCharSet.contains("" + tmp.charAt(1)) && specialCharSet.contains("" + source)) {
                    return "";
                }
            } catch (Exception e) {
                if (et.getText().toString().length() >= 1 && specialCharSet.contains("" + et.getText().toString().charAt(0)) && specialCharSet.contains(source)) {
                    return "";
                }
            }

            return null;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et = (EditText) findViewById(R.id.et);
        et.setFilters(new InputFilter[] { filter });

    }

}

答案 1 :(得分:1)

我建议您通过以下方式更改您的实施:

  • 为您允许的两种输入模式构建正则表达式
  • 使用来自source,start,end,dest,dtsart和dend的信息构建用户输入所产生的字符串
  • 检查此字符串是否与您的两个正则表达式中的一个匹配,如果不匹配则返回“”

应该或多或少地做到这一点。几个月前我做过类似的事。如果你很幸运,我可以找到代码并将其粘贴在这里,当我今晚回家时:)但总的来说这应该是非常直接的。如果你不确定source,start,end,dest,dstart和dend的值,请在调试器中检查它们,以便更好地理解。

- 更新 - 好消息是,我在我曾经发布的问题中找到了我的代码;)

public class MoneyFilter implements InputFilter {

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
        Spanned dest, int dstart, int dend) {

        // The regex to test the string
        String testRegex = "^\\d+\\,?\\d{0,2}$";

        String s = source.toString();
        String d = dest.toString();

        // Build the string that would return from the user's input
        String r = d.substring(0, dstart) + s.substring(start, end)
            + d.substring(dend);

        // And check it
        if (r.matches(testRegex)) {
            return null;
        } else {
            return "";
        }
    }
}

你当然需要不同的正则表达式来匹配字符串,但其余的代码应该可以工作。

希望这有帮助,

的问候,

汉斯