2016-07-30 6 views
0

나는 8 개의 프래그먼트를 가지고 있는데, 각 프래그먼트는 레이아웃을 확장하고 TextInputLayout 안에 래핑 된 EditText를 포함합니다. onCreateView에서 아래와 같이 각 조각 몸에 MyTextWatcher를 구현 할 필요도일반적인 TextWatcher 클래스

EditText inputTextFrag1 = (EditText)findViewById(R.id.et_frag1); 
inputTextFrag1.addTextChangedListener(new MyTextWatcher(inputTextFrag1)); 

암을 구현하고있다 :

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; 
     } 

대신 같은 클래스/메소드 8 번 복제의 각 조각에 의해 호출되는 하나의 MyTextWatcher 어딘가에 클래스와 하나 validateName() 메소드를 가질 수있는 방법이 있나요. 감사합니다

이 방법은 BaseDialogFragment 안에 TextWatcher 클래스를 두는 올바른 방법입니까?

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 메소드에는 어떤 논리가 적용됩니까?

답변

0

조각으로 확장 할 BaseFragment을 만들 수 있습니다.

그러므로 TextWatcherBaseFragment 안에 관리하면이 유산을 가진 조각에 예상되는 로직이 적용됩니다. 다음 예에서와 같이

:

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 { 
    ... 
} 
+0

@ Geob, 왜 댓글을 달았습니까? –

+0

@ uoɥʇʎPʎzɐɹC- 죄송합니다. 실수를 깨달았습니다. 실행 취소를 시도했지만 시도 할 수 없습니다. – Geob

0

복제에 대한 필요가 없습니다. 현재 구현에서는 MyTextWatcher 클래스가 다른 클래스 (아마도 조각 클래스)의 inner class 인 것으로 보입니다. 이 구현 방식에서는 모든 조각 클래스간에이를 공유 할 수 없습니다.

그러나 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의 솔루션이 더 좋습니다 (즉 기본 단편 클래스 사용).

관련 문제