使用TextWatcher进行Android验证

时间:2013-12-01 17:37:02

标签: android validation overloading textwatcher

尽管存在问题名称,但这确实与基本OOP有关。

使用TextWatcher进行表单输入验证似乎(在对此事进行一些研究之后)是Android上为我的目的提供的最有效的验证方法。然而,我遇到了一个相当基本的问题。

public class MatchConfig extends Activity implements TextWatcher {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_match_config);
        // Show the Up button in the action bar.
        setupActionBar();

        final EditText teamA = (EditText) findViewById(R.id.teamA_editText); //Team A input
        teamA.addTextChangedListener(this);   //Team A validation
        final EditText teamB = (EditText) findViewById(R.id.teamB_editText);  //Team B input
        teamB.addTextChangedListener(this);   //Team B validation
        final EditText halves = (EditText) findViewById(R.id.halves_editText);  //halves input
        halves.addTextChangedListener(this);   //halves validation
            Button start = (Button) findViewById(R.id.start_button);

start.setOnClickListener(new OnClickListener() {

    // SEND OFF TO DATABASE HANDLING
)}

//Other Stuff
@Override
    public void afterTextChanged(Editable arg0) {
        // TODO Auto-generated method stub
         //Guard against SQL injection, etc.
        Toast.makeText(this, "after text test", Toast.LENGTH_SHORT).show();

    }


    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "before text test", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "on text test", Toast.LENGTH_SHORT).show();

    }

虽然这段代码有效,但我看不出如何为单独的表单元素实现不同的afterTextChanged方法。对于各种类型的输入,验证自然会有所不同。虽然我可以重载(而不是覆盖)像afterTextChanged这样的方法,但我无法通过这些方法直接调用它(因此无法指定参数以便专门使用重载方法)。

一个小小的一边:有没有办法减少这个实现可能会在Android设备上要求的处理?我担心用户输入的每个字符的这种调用会占用CPU。

2 个答案:

答案 0 :(得分:1)

您应该按照TextWatcher创建一个EditText,而不是让您的Activity实现TextWatcher,就像处理OnClickListener一样。

另外,您通常应将TextWatchers设置为onResume()(或至少在onRestoreInstanceState()之后)。否则,当TextWatcher恢复之前输入的文本时(如果用户更改设备配置,例如旋转手机),EditText可能会触发。

答案 1 :(得分:1)

你可以在afterTextChanged中为ex:

添加一个switch case
@Override
    public void afterTextChanged(Editable arg0) {
       switch(arg0.getId()){
           case R.id.teamA_editText:

           break;
           case R.id.teamB_editText:

           break;
           case R.id.teamC_editText:

           break;

       }
        Toast.makeText(this, "after text test", Toast.LENGTH_SHORT).show();

    }