2016-02-11 82 views
0

我有一些代碼,利用材質對話框庫;我有一個與四個EditText字段(電子郵件,名稱,用戶名,密碼)的對話框。我想它,以便對話框的註冊按鈕是無效的,除非各個領域中都有至少一個字符。TextWatcher多的EditText領域

我,四處搜尋,找到了一種方法來做到這一點;不幸的是,它似乎沒有工作。例如,如果我拉起對話框並在任何單個字段中輸入任何內容,則該按鈕將變爲啓用狀態。但是,如果我編輯單個字段,然後編輯另一個字段,但刪除其中一個字段內的文本 - 該按鈕將被禁用;如果我要填寫所有字段,則會發生同樣的情況,然後刪除單個字段中的文本。

我曾想過利用其他的建議(這將涉及寫我自己的私有內部類) - 但我並不認爲這事考慮我想達到同樣的事情(至少,據我所知, )。

首先你需要textwatcher添加到特定的EditText,你沒有:如

 //registerDialog is a MaterialDialog object 
     final View registerAction = registerDialog.getActionButton(DialogAction.POSITIVE); 
     final EditText registerNameInput; 
     final EditText registerEmailInput; 
     final EditText registerUsernameInput; 
     final EditText registerPasswordInput; 
     if (registerDialog.getCustomView() != null) { 
      registerNameInput = (EditText) registerDialog.getCustomView().findViewById(R.id.register_name); 
      registerEmailInput = (EditText) registerDialog.getCustomView().findViewById(R.id.register_email); 
      registerUsernameInput = (EditText) registerDialog.getCustomView().findViewById(R.id.register_username); 
      registerPasswordInput = (EditText) registerDialog.getCustomView().findViewById(R.id.register_password); 

      /* 
      * TextWatcher lets us monitor the input fields while registering; 
      * This make sure we don't allow the user to register with empty fields 
      */ 
      TextWatcher watcher = new TextWatcher() { 
       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       } 
       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 
        registerAction.setEnabled(s.toString().trim().length() > 0); 
       } 
       @Override 
       public void afterTextChanged(Editable s) { 
       } 
      }; 
      /*We want to watch all EditText fields for input*/ 
      registerNameInput.addTextChangedListener(watcher); 
      registerEmailInput.addTextChangedListener(watcher); 
      registerUsernameInput.addTextChangedListener(watcher); 
      registerPasswordInput.addTextChangedListener(watcher); 
     } 
    registerDialog.show(); 
    registerAction.setEnabled(false); //disabled by default 
+0

你是說你想在多個editText中添加同樣的TextWatcher? –

+0

@ShreeKrishna是;根據其他的答案 - 我實施它的方式應該是一種方法來做到這一點。 – Nxt3

回答

3

更改代碼。嘗試如下:

yourEditText.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

      // TODO Auto-generated method stub 
     } 

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

      // TODO Auto-generated method stub 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 

      // TODO Auto-generated method stub 
     } 
    }); 

然後,

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    if (registerNameInput.getText().toString().length() > 0 
       && registerEmailInput.getText().toString().length() > 0 
       && registerUsernameInput.getText().toString().length() > 0 
       && registerPasswordInput.getText().toString().length() > 0) { 
        registerAction.setEnabled(true); 
    } else { 
     registerAction.setEnabled(false); 
    } 
} 
+0

這不起作用。無論我輸入多少,該按鈕都保持禁用狀態。 – Nxt3

+0

檢查我的編輯答案或創建一個類爲什裏克里希納在他的回答提出。 – user5716019

+0

我已經嘗試過我自己的課程 - 並且獲得了相同的結果。 – Nxt3

0

你可以做這樣的事情,但不要照搬我沒有檢查的代碼。

public class MyTextWatcher implements TextWatcher { 

    EditText editText, anotherEditText; 
    View myView; 

// Your constructor 
    public MyTextWatcher(EditText editText, EditText anotherEditText View myView) { 
     this.editText = editText; 
     this.myView = myView 
     this.anotherEditText = anotherEditText 
    } 
@Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

@Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     if(anotherEditText.getText().toString().trim().lenght()>0){ 
      myView.setEnabled(s.toString().trim().length() > 0); 
     } 
    } 

@Override 
    public void afterTextChanged(Editable s) {//something } 

使用這個類

editText.addTextChangedListener(new MyTextWatcher(editText, editText2, myView)); 
+1

但這與我在做什麼不同?我所做的只是創建一個能夠做同樣事情的課程。 – Nxt3

+0

我試着寫我自己的課來處理它,發生同樣的事情。我不認爲這會奏效,請考慮我在上述評論中所說的話。 – Nxt3

+0

你可以做的是,在構造函數中傳遞每個字段,並檢查所有editText是否爲空或不在'onTextChanged'方法中。如果沒有,那麼啓用你的按鈕。 –

0

使你實現的微小變化,你可能已經實現了。而不是增加邏輯onTextChanged的,你可以創建一個方法,像

private void validateInput(){ 
     boolean enableButton = true; 
     if (registerNameInput.getText() == null || registerNameInput.getText().toString() == null || registerNameInput.getText().toString().trim().length() == 0){ 
      enableButton = false; 
     } 
     if (registerEmailInput.getText() == null || registerEmailInput.getText().toString() == null || registerEmailInput.getText().toString().trim().length() == 0){ 
      enableButton = false; 
     } 
if (registerUsernameInput.getText() == null || registerUsernameInput.getText().toString() == null || registerUsernameInput.getText().toString().trim().length() == 0){ 
      enableButton = false; 
     } 
if (registerPasswordInput.getText() == null || registerPasswordInput.getText().toString() == null || registerPasswordInput.getText().toString().trim().length() == 0){ 
      enableButton = false; 
     } 


     registerAction.setEnabled(enableButton); 
    } 

,並呼籲該方法afterTextChanged()

TextWatcher watcher = new TextWatcher() { 
       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       } 
       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 

       } 
       @Override 
       public void afterTextChanged(Editable s) { 
        validateInput(); 
       } 
      }; 

效益檢查一個接一個的,是例如你希望你的電子郵件輸入把額外的檢查,那麼你可以添加喜歡

if (registerEmailInput.getText() == null || registerEmailInput.getText().toString() == null || registerEmailInput.getText().toString().trim().length() == 0){ 
       enableButton = false; 
      }else{ 
      //put if block to check email input format is correct or not, if not then set enableButton = false; 
} 
0

如果你要使用多個編輯文本單TextWatcher類,這將僅適用afterTextChanged(編輯版可以)

public void afterTextChanged(Editable editable) { 
     if (editable == editText1.getEditableText()) { 
      // do something 
     } else if (editable == editText2.getEditableText()) { 
      // do something 
     } 
    }