Это кажется очень & хотят ли это правильный способ сделать это или Должен ли я изменить расчетный рисунок
Это похоже на слишком сложный дизайн для меня. Я предпочел бы сохранить все 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;
}
...
}
В чем разница между тремя основными фрагментами? они просто обновляют разные объекты? Где вы показываете окончательные обновленные данные? или вы просто храните его и продолжаете показывать формы ввода? Кроме того, пункт 5 не очень ясен. Имеет ли фрагмент А особый случай, отличный от сценария, описанного в 1-4? –
Ответит Q на Q. 3 Фрагменты - это 3 разных субпотока. Все они независимы, но могут получать данные с использованием SQLIte, который сохраняется из предыдущего фрагмента. Просто собираем данные и отправляем в API и SQLite. Фрагмент имеет несколько полей ввода, а кнопка SAVE & 1-4 имеет только функцию SWIPE для перемещения следующего экрана. – VVB