0

В настоящее время я работаю над модулем 1 моего приложения &, который я хочу применить для других модулей.Как управлять передачей данных?

У меня ниже элементов в модуле 1

  1. MainActivity -> 3 Фрагменты [A, B, C]
  2. Все 3 Фрагменты содержат -> ViewPager
  3. Каждый ViewPager имеет -> 5 Фрагменты [ p, q, r, s, t]
  4. Все фрагменты ViewPager представляют собой формы ввода & хотят обмениваться данными из фрагмента ViewPager с 1 по 2 по 3 до 5. На фрагменте 5 активируется кнопка SAVE, которая сохраняет данные. (предположим, что фрагмент 1-5 означает p-t)
  5. Другая часть - это фрагмент 1 или A, как контейнер, который имеет код ViewPager для загрузки 5 подфрагментов & получить данные из последовательных фрагментов & пройти дальше.

Мой вопрос,

Это кажется очень & хотят ли это правильный способ сделать это или я должен изменить этот шаблон проектирования? И если этот подход к дизайну правильный, то как мне управлять передачей данных?

+0

В чем разница между тремя основными фрагментами? они просто обновляют разные объекты? Где вы показываете окончательные обновленные данные? или вы просто храните его и продолжаете показывать формы ввода? Кроме того, пункт 5 не очень ясен. Имеет ли фрагмент А особый случай, отличный от сценария, описанного в 1-4? –

+0

Ответит Q на Q. 3 Фрагменты - это 3 разных субпотока. Все они независимы, но могут получать данные с использованием SQLIte, который сохраняется из предыдущего фрагмента. Просто собираем данные и отправляем в API и SQLite. Фрагмент имеет несколько полей ввода, а кнопка SAVE & 1-4 имеет только функцию SWIPE для перемещения следующего экрана. – VVB

ответ

0

Имейте в виду, что у вас будут разные способы сделать это, и ни один из них не является правильным, только проще или чище. Итак, если бы я был вами, я бы попытался отделить объекты домена и иметь модель для данных и представлений, обрабатывающих только часть представления. Лучше всего для меня следовать шаблону MVVM, который дает вам много контроля, и вы можете прочитать об этом в документах библиотеки databinding docs.

Другой способ взломать его, скажем, иметь Singleton WorkFlowManager, доступ к которому имеет все Views, и иметь в нем все данные и бизнес-логику. Таким образом, Any Fragment/Activity может проверить, установлены ли все поля формы, и сделать кнопку Save (например) видимой. Если вы хотите обновить представления событиями, вы можете создать пользовательские eventListeners в Менеджере, и как только последнее поле будет заполнено, триггер, который FormFilledEvent (или аналогичный), и зарегистрируйте этот фрагмент, чтобы прослушать его, и сделайте Буттон виден.

Это один Используйте случай, но вы можете иметь несколько

Счастливый кодирования;)

+0

Прочтите мой комментарий, добавленный в @ A.A. – VVB

0

Это кажется очень & хотят ли это правильный способ сделать это или Должен ли я изменить расчетный рисунок

Это похоже на слишком сложный дизайн для меня. Я предпочел бы сохранить все 5 фрагментов ViewPager в виде одной формы с помощью кнопки FAB/save, чтобы избежать передачи данных из основного фрагмента в каждый из суб-фрагментов. Однако это может привести к очень длинной форме в случае, который вы описываете, или слишком много проверок, если поля зависят от предыдущих.

если этот подход к дизайну правильный, то как мне управлять данными ?

Для каждого основного Fragment, Я хотел бы использовать один объект, который реализует Parcelable для всей суб-потоку, которая загружается из базы данных на основной фрагмент, затем перешел к суб-фрагментов, по одному за раз заполнение соответствующих полей. Последний суб-фрагмент будет нести ответственность за сохранение обновленного объекта в базу данных, или просто передать его обратно в основной фрагмент для сохранения

Update:

Я не проверял этот код, но здесь это один из способов, как я бы передать данные из основного фрагмента суб- фрагментов:

MainFragment.java

public class MainFragment extends Fragment 
{  
    private MyObj myObj; 
    private SubFragment currentFragment; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) 
    { 
     final View view = inflater.inflate(R.layout.fragment, parent, false); 
     final ViewPager pager = (ViewPager) view.findViewById(R.id.pager); 

     myObj = db.loadObject(); 
     pager.setAdapter(new MyPagerAdapter(getChildFragmentManager())); 

     return view; 
    } 

    public static class MyPagerAdapter extends FragmentPagerAdapter 
    { 

     MyPagerAdapter(FragmentManager manager) 
     { 
      super(manager); 
     } 

     @Override 
     public Fragment getItem(int position) 
     { 
      if(currentFragment != null) myObj = currentFragment.getMyObj(); 
      switch(position) 
      { 
       case 4: 
        currentFragment = FragmentT.getInstance(myObj); 
        break; 
       case 3: 
        currentFragment = FragmentS.getInstance(myObj); 
        break; 
       case 2: 
        currentFragment = FragmentR.getInstance(myObj); 
        break; 
       case 1: 
        currentFragment = FragmentQ.getInstance(myObj); 
        break; 
       case 0: 
       default: 
        currentFragment = FragmentP.getInstance(myObj); 
      } 
      return currentFragmnet; 
     } 

     @Override 
     public int getCount() 
     { 
      return 5; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) 
     { 
      return titles[position]; 
     } 
    } 
} 

SubFragment.java

public class SubFragment extends Fragment 
{ 
    protected static final String ARGS = "args"; 

    protected MyObj myObj; 

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

     final Bundle args = getArguments(); 
     if (args != null) 
     { 
      myObj = args.getParcelable(ARGS); 
     } 
    } 

    public MyObj getMyObj() 
    { 
     return myObj; 
    } 
} 

FragmentP.java

public class FragmentP extends SubFragment 
{   
    public static FragmentP getInstance(MyObj myObj) 
    { 
     final FragmentP fragment = new FragmentP(); 
     final Bundle args = new Bundle(); 
     args.putParcelable(ARGS, myObj); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    ... 
} 
+0

Нет, но как вам удастся передать данные по SWIPE из фрагмента 1 в другой. Я имею в виду, как вы будете управлять прослушивателем смены страницы внутри субфрагментов. – VVB

+0

@VVB Я обновил свой ответ с помощью некоторого кода одного из способов передать данные в субфрагменты –

0

Это может быть решена с помощью шаблона проектирования наблюдателя. Сделайте ваши модели наблюдаемыми и зарегистрируйте все компоненты ui, которые будут обновляться в качестве наблюдателей. Я бы порекомендовал RXjava решить эту проблему.

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