2016-06-18 2 views
2

У меня есть два фрагмента (каждая вкладка в активности скользящей вкладки) в моем приложении. У двух фрагментов есть некоторые методы, которые теперь идентичны, я думал, что я мог бы абстрагировать эти методы, чтобы следовать принципу СУХОЙ (не повторяй себя). Есть ли рекомендуемый способ сделать это?Пусть Фрагменты используют один и тот же метод

Является ли класс утилиты со статическими методами хорошим способом? Или я должен создать абстрактный класс «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); 
    } 
} 

Чем мои фрагменты могут расширить этот класс и установить свойства и использовать методы. Но я также вижу, что я также мог бы сделать статический класс для использования только для методов, таких как addButtonToFragmentView(final String btnText, Context context, final LinearLayout linearLayout) и upDateAdapterList(List<String> list, MyAdapter adapter)

Или есть предпочтительный способ сделать это?

ответ

1

Мы должны попытаться следовать за композицией над наследованием. Может быть, у вас может быть выделенный класс UIFactory, который имеет дело с динамическим созданием представлений, тогда вы переместите свой метод addButtonToFragmentView на фабрику пользовательского интерфейса и сделаете, если более общий.

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

Насколько upDateAdapterList обеспокоен вы можете создать BaseListFragment и переместить его туда, так тот, кто заинтересован в использовании фрагмента со списком может продлить этот фрагмент. Следовательно, это следует принципу единой ответственности.

+0

Почти как я сделал, но просто переместить метод addButtonToFragmentView к UIFactory класса? чем мне пришлось бы создать делегат для кнопок onClickListerner? Это похоже на более стандартный подход, поскольку метод кнопки добавления можно легко использовать повторно. Я помечаю этот ответ, а принятый, но im открыт для большего ввода. – user3711421

+0

Если это так, то ваш addButtonToView примет OnClickListener, а также параметр. Я сказал, чтобы перенести его на фабрику пользовательского интерфейса, потому что, если будущее говорит, что любая активность и фрагмент могут требовать динамического добавления просмотров. Поэтому они просто будут использовать этот класс 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

Но поскольку методы абстрактны, я не могу предоставить тело и должен будет реализовать один и тот же код для каждого фрагмента. То, что я пытаюсь сделать, это просто написать код в одном месте и позволить двум фрагментам использовать этот код. – user3711421

Смежные вопросы