Общий класс TextWatcher
У меня есть 8 фрагментов, каждый раздувая макет, среди прочего, EditText, завернутый в TextInputLayout. В onCreateView я реализую
EditText inputTextFrag1 = (EditText)findViewById(R.id.et_frag1);
inputTextFrag1.addTextChangedListener(new MyTextWatcher(inputTextFrag1));
Я также должен реализовать класс MyTextWatcher в каждом теле фрагмента, как показано ниже:
private class MyTextWatcher implements TextWatcher {
private View view;
public MyTextWatcher(View view) {
this.view = view;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
saveButton.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
saveButton.setClickable(false);
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
saveButton.getBackground().setColorFilter(null);
switch (view.getId()) {
case R.id.et_frag1:
validateName();
break;
}
}
}
Где validateName();
private boolean validateName() {
if (inputTextFrag1 .getText().toString().trim().isEmpty()) {
mInputLayoutName.setError(getString(R.string.err_msg_name));
requestFocus(inputTextFrag1 );
return false;
} else {
mInputLayoutName.setErrorEnabled(false);
}
return true;
}
Есть ли способ иметь только один класс MyTextWatcher где-нибудь и один метод validateName (), который будет вызываться каждым фрагментом вместо дублирования одного и того же класса / метода 8 раз. Спасибо
Это правильный способ разместить класс TextWatcher внутри BaseDialogFragment?
public abstract class BaseDialogFragment extends DialogFragment{
private class MyTextWatcher implements TextWatcher {
private View view;
public MyTextWatcher(View view) {
this.view = view;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
}
}
Какая логика входит в методы beforeTextChanged и afterTextChanged TextWatcher?
2 ответа
Вы можете создать BaseFragment
это будет расширено вашими фрагментами.
Таким образом, вы можете управлять своим TextWatcher
внутри этого BaseFragment
и поэтому фрагменты, имеющие это наследие, получат вашу ожидаемую логику.
Как в следующем примере:
BaseFragment.class
public abstract class BaseFragment extends Fragment implements TextWatcher {
EditText editText;
Button button;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//inflate your edit text
...
//inflate your button
...
editText.addTextChangedListener(this);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//text watcher listener
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//text watcher listener
}
@Override
public void afterTextChanged(Editable s) {
//text watcher listener
}
}
YourFragment.class
public class YourFragment extends BaseFragment {
...
}
Нет необходимости в дублировании. В вашей текущей реализации, кажется, ваш MyTextWatcher
класс является внутренним классом другого класса (возможно, фрагментный класс). При таком способе реализации вы не можете разделить его между всеми классами фрагментов.
Однако, если вы определите свой MyTextWatcher
класс как отдельный класс, вы можете использовать его для всех классов фрагментов. Для этого вам следует использовать только те переменные и члены класса, которые были объявлены в области действия определяемого класса. В твоем случае saveButton
переменная не принадлежит MyTextWatcher
класс (он доступен из внешней области видимости), в таких случаях вы должны импортировать их через метод конструктора.
private class MyTextWatcher implements TextWatcher {
private View view;
private Button saveButton;
public MyTextWatcher(View view, Button saveButton) {
this.view = view;
this.saveButton = saveButton;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
saveButton.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
saveButton.setClickable(false);
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
saveButton.getBackground().setColorFilter(null);
switch (view.getId()) {
case R.id.et_frag1:
validateName();
break;
}
}
}
Теперь вы можете создать экземпляр этого класса 8 раз для своих 8 фрагментов.
Тем не менее, решение @Bruno Vieira лучше (т.е. использует базовый класс фрагмента).