2016-07-30 19 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回複製する各フラグメントによって呼び出されるだけで1 MyTextWatcherどこかのクラスと1 validateName()メソッドを持ってする方法はあります。ありがとう

これは、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) { 
     } 
    } 
} 

TextWatcherのbeforeTextChangedメソッドとafterTextChangedメソッドにはどのようなロジックがありますか?

答えて

0

フラグメントによって拡張される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 { 
    ... 
} 
+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の方が優れています(つまり、基本フラグメントクラスを使用する)。

関連する問題