如何在编辑文本为空/非空时禁用/启用按钮

时间:2012-02-27 20:03:15

标签: java android

我有2个编辑文本和1个按钮。在用户填写所有编辑文本之前,如何禁用此按钮?我使用了这段代码,但是当我运行这段代码时,它总是禁用按钮,即使我填写了2个Edit文本,也不知道onTextChanged和beforeTextChanged做了什么!!

请帮助我,我将不胜感激。

public class TestActivity extends Activity {
/** Called when the activity is first created. */
EditText edit1;
EditText edit2;
EditText edit3;
Button button;
String test1;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // Your initialization code...
    // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            edit1= (EditText) findViewById(R.id.edit1);
            edit2= (EditText) findViewById(R.id.edit2);

            button=(Button) findViewById(R.id.button);




   TextWatcher watcher = new LocalTextWatcher();
    edit1.addTextChangedListener(watcher);
    edit2.addTextChangedListener(watcher);

    updateButtonState();
}

void updateButtonState() {
    boolean enabled;
    if(enabled = checkEditText(edit1)
        && checkEditText(edit2)){
        button.setEnabled(enabled);}
        }
}

private boolean checkEditText(EditText edit) {
    return Integer.getInteger(edit1.getText().toString()) != null;
}

private class LocalTextWatcher implements TextWatcher {
    public void afterTextChanged(Editable s) {
        updateButtonState();
    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }
}




}}}

2 个答案:

答案 0 :(得分:2)

Monerah将checkEditText方法更改为:

private boolean checkEditText(EditText edit) {
    return edit.getText().length() == 0;
}

和你的updateButtonState():

void updateButtonState() {
    if(checkEditText(edit1) && checkEditText(edit2)) button.setEnabled(false);
    else button.setEnabled(true);
}

这会使它正常工作。

作为一个额外的建议,我会更改isEditTextEmpty的checkEditText名称或更具代表性的名称。它会使if语句更具可读性:)

关于onTextChanged和beforeTextChanged方法的问题,请看看以下内容:

beforeTextChanged(CharSequence s,int start,int count,int after)。 这意味着字符即将被替换为一些新文本。该文本是不可编辑的。 使用:当您需要查看即将更改的旧文本时。

onTextChanged(CharSequence s,int start,int before,int count)。 已经进行了更改,一些字符已被替换。该文本是不可编辑的。 使用:当您需要查看文本中的哪些字符是新的时。

afterTextChanged(可编辑的)。 与上面相同,除了现在文本是可编辑的。 使用:当您需要查看并可能编辑新文本时。

前两种方法对于您尝试使用afterTextChanged完成后无用。 希望它有所帮助。

答案 1 :(得分:0)

实际上,根据文本字段中的内容,任何这些方法都可用于完成启用/禁用按钮:

@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
    if (charSequence.length() == 0 && after > 0) {
        // enable button
    } else if (charSequence.length() == count && after == 0) { 
        // disable button
    }
}

// OR

@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
    if (charSequence.length() == count && before == 0) {
        // enable button
    } else if (charSequence.length() == 0 && before > 0)  
        // disable button
    }
}

// OR

@Override
public void afterTextChanged(Editable editable) {
    if (editable.length() > 0 && !button.isEnabled()) {
        // enable button
    } else if (editable.length() == 0 && btnEnroll.isEnabled()) {
        // disable button 
    }
}