skon
skon

Reputation: 615

Binding several views to a Listener with multiple methods in Butterknife

I'm using Butterknife(8.4.0) to instantiate my views in a fragment that has several EditTexts.

I'm using these EditTexts to set a string to a specific Model attribute. I don't want to create loads of bind methods for each Edittext so on @onTextChanged I pass in all the edit texts. I'm only interested in AfterTextChanged() so I've also passed that in. I then use the editText ids to specify which model attribute should be set.

@BindView(R.id.edit_text_one) EditText textFieldOne;
@BindView(R.id.edit_text_two) EditText textFieldTwo;

@OnTextChanged(value = {R.id.edit_text_one, R.id.edit_text_two}, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
    void setEditTextFields(EditText editText, Editable editable) {
        switch (editText.getId()) {
            case R.id.edit_text_one:
                myModel.setStringOne(editable.toString());
                break;
            case R.id.edit_text_two:
                myModel.setStringTwo(editable.toString());
                break;
        }
    }

However I'm getting a compile error

Error:(117, 10) error: @OnTextChanged methods can have at most 1 parameter(s). (com.skeeno.android.gamecabinet.Fragment.EditorFragment.setEditTextFields)

I've read here that you just pass in the view as the first argument but that doesn't seem to work since AfterTextChanged is only expecting an editable.

Is there a way to do this?

Any help will be greatly appreciated. Thanks.

Upvotes: 1

Views: 1284

Answers (2)

Ergin Ersoy
Ergin Ersoy

Reputation: 889

It is a little bit late but if anyone will have this issue, answer can be helpful therefore, here how i make it work. You cannot send two parameter method for AFTER_TEXT_CHANGED therefore; you need to change method void setEditTextFields(EditText editText, Editable editable) to void setEditTextFields(Editable editable). In this case you need to write @OnTextChanged for all EditText you want to listen. Here is final code should be;

@BindView(R.id.edit_text_one) EditText textFieldOne;
@BindView(R.id.edit_text_two) EditText textFieldTwo;

@OnTextChanged(value =R.id.edit_text_one, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
void edit_text_oneChanged(Editable editable) {
    myModel.setStringOne(editable.toString());
}


@OnTextChanged(value =R.id.edit_text_two, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
void edit_text_twoChanged(Editable editable) {
    myModel.setStringTwo(editable.toString());
}

Upvotes: 0

arungiri_10
arungiri_10

Reputation: 988

Passing View with @onTextChanged is not possible currently. I tried too.

However, below code can be used to get the current view,

//Inside a fragment

View view = getActivity().getCurrentFocus();

Hope this helped.

Upvotes: 1

Related Questions