常见的 TextWatcher class
Common TextWatcher class
我有 8 个片段,每个片段都使用 TextInputLayout 包裹的 EditText 等布局来扩充布局。在 onCreateView 中,正在实施
EditText inputTextFrag1 = (EditText)findViewById(R.id.et_frag1);
inputTextFrag1.addTextChangedListener(new MyTextWatcher(inputTextFrag1));
我还必须在每个片段主体中实现 MyTextWatcher class,如下所示:
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 class 和一个 validateName() 方法,而不是将相同的 class/method 复制 8 次。谢谢
这是将 TextWatcher class 放置在 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) {
}
}
}
TextWatcher 的 beforeTextChanged 和 afterTextChanged 方法采用什么逻辑?
您可以创建一个 BaseFragment
将由您的片段扩展。
因此,您可以在此 BaseFragment
中管理您的 TextWatcher
,因此具有此传统的片段将获得您期望的逻辑。
如下例所示:
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
class 似乎是另一个 class 的 inner class(可能是片段 class)。在这种实现方式中,您无法在所有片段 classes.
之间共享它
但是,如果您将 MyTextWatcher
class 定义为独立的 class,则可以将其用于所有片段 classes。为此,您应该只使用已在定义的 class 范围内声明的变量和 class 成员。在你的情况下 saveButton
变量不属于 MyTextWatcher
class (它可以从外部范围访问),在这种情况下,你应该通过构造方法导入它们。
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 个片段实例化此 class 8 次。
然而,@Bruno Vieira 的解决方案更好(即使用基本片段 class)。
我有 8 个片段,每个片段都使用 TextInputLayout 包裹的 EditText 等布局来扩充布局。在 onCreateView 中,正在实施
EditText inputTextFrag1 = (EditText)findViewById(R.id.et_frag1);
inputTextFrag1.addTextChangedListener(new MyTextWatcher(inputTextFrag1));
我还必须在每个片段主体中实现 MyTextWatcher class,如下所示:
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 class 和一个 validateName() 方法,而不是将相同的 class/method 复制 8 次。谢谢
这是将 TextWatcher class 放置在 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) {
}
}
}
TextWatcher 的 beforeTextChanged 和 afterTextChanged 方法采用什么逻辑?
您可以创建一个 BaseFragment
将由您的片段扩展。
因此,您可以在此 BaseFragment
中管理您的 TextWatcher
,因此具有此传统的片段将获得您期望的逻辑。
如下例所示:
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
class 似乎是另一个 class 的 inner class(可能是片段 class)。在这种实现方式中,您无法在所有片段 classes.
但是,如果您将 MyTextWatcher
class 定义为独立的 class,则可以将其用于所有片段 classes。为此,您应该只使用已在定义的 class 范围内声明的变量和 class 成员。在你的情况下 saveButton
变量不属于 MyTextWatcher
class (它可以从外部范围访问),在这种情况下,你应该通过构造方法导入它们。
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 个片段实例化此 class 8 次。
然而,@Bruno Vieira 的解决方案更好(即使用基本片段 class)。