2016-06-18 15 views
2

私のアプリケーションでは、2つのフラグメント(スライディングタブのアクティビティ内の各タブ)があります。 2つの断片には同じメソッドがありますが、DRY(自分自身を繰り返さない)の原則に従うようにこれらのメソッドを抽象化できると思いました。これを行う推奨方法はありますか?フラグメントに同じメソッドを使用させる

静的メソッドのutilクラスは良い方法ですか?または、これらのメソッドを持つ抽象クラス "MyAbstractFragment"を作成し、このクラスを拡張する必要がありますか?

たとえば、

public class MyCustomFragment extends Fragment { 
    protected LinearLayout linearLayout; 
    protected MyAdapter adapter; 
    //more common fields 

    void addButtonToFragmentView(final String btnText) { 
     final Button btn = new Button(getContext()); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       linearLayout.removeView(btn); 
      } 
     }); 
     btn.setText(btnText); 
     linearLayout.addView(btn); 
    } 

    void upDateAdapterList(List<String> list){ 
     //.... 
     adapter.updateList(list); 
    } 
} 

私のフラグメントがこのクラスを拡張し、プロパティを設定してメソッドを使用する可能性があります。しかし、私は同様に、メソッドのためだけに静的なutilクラスを作ることもできます。addButtonToFragmentView(final String btnText, Context context, final LinearLayout linearLayout)upDateAdapterList(List<String> list, MyAdapter adapter)

これを行う方法がありますか?

答えて

1

継承を超えて合成を試みる必要があります。あなたは、ビューの動的作成を扱う専用のUIFactoryクラスを持つことができます。次に、addButtonToFragmentViewメソッドをUIファクトリに移動し、より汎用的なものにします。

void addButtonToView(final String btnText, final Context, final View parentView); 

は、限りupDateAdapterListが関係しているとして、あなたがBaseListFragmentを作成することができますし、そこに移動するので、この断片を拡張することができます一覧でフラグメントを使用してに興味がある人は誰でも。したがって、これは単一責任原則に従います。

+0

ちょうどのUIFactoryクラスにメソッドaddButtonToFragmentViewを移動:

コードから取ら? onClickListernerボタンのデリゲートを作成する必要がありますか?これは、ボタンの追加メソッドを簡単に再利用できるので、より標準的なアプローチのようです。私はこの回答を受け入れてマークしますが、より多くの情報を得るために開いています。 – user3711421

+0

その場合、addButtonToViewはOnClickListenerとパラメータを受け入れます。私はそれをあなたのUI工場に移したと言いました。なぜなら、将来的にどんなアクティビティーやフラグメントにもビューを動的に追加する必要があるからです。したがって、彼らはこのUIFactoryクラスを使用します。 –

3

はい、あなたは以下のような抽象クラスを使用することができます。

public abstract class BaseFragment extends Fragment { 

    @Override public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
    } 

    public Context getContext() { 
    return this.getActivity().getApplicationContext(); 
    } 

    protected abstract void addButtonToFragmentView(final String btnText); 

    protected abstract void upDateAdapterList(List<String> list){ 
} 

、この基底クラスを使用して新しいフラグメントを拡張します。私が行っているほとんどのよう https://github.com/spirosoik/AndroidArchitecturePadawans/blob/master/presentation/src/main/java/com/architecture/padawans/views/common/BaseFragment.java

+0

しかし、メソッドは抽象であるため、ボディを提供することはできず、各フラグメントに対して同じコードを実装する必要があります。何をしようとしているのは、コードを1つの場所に書き込んで、2つのフラグメントがそのコードを使用するようにすることです。 – user3711421

関連する問題