SectionsPageAdapter с FragmentPageAdapter
Сначала позвольте мне попытаться воспроизвести мою проблему / вопрос.
Моя активность - это вкладка с тремя вкладками, выполненная с помощью SectionPageAdapter и FragmentPageAdapter.
На этих 3 вкладках пользователь вводит данные. Просто проведя пальцем, пользователь может изменить вкладку. После того как пользователь заполнил все данные, он должен щелкнуть кнопку FloatingActionButton, чтобы сохранить данные.
Теперь есть моя проблема, я не знаю, смогу ли я получить доступ к этим 3 фрагментам с заполненными данными? Могу ли я загрузить все 3 фрагмента с заполненными данными, прочитать данные и сохранить их, или я должен обработать PageChangeListenEvent и сохранить данные, прежде чем изменить страницу?
Код:
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return TravelInfoActivity.PlaceholderFragment.newInstance(position + 1);
}
@Override
public int getCount() {
return maxTabs;
}
}
public static class PlaceholderFragment extends Fragment {
private static final String ARG_FRAGMENT_ID = "fragment_id";
private static int REQUEST_CODE_PLACE = 1;
private View currentRootView;
private View currentClickedView;
@SuppressLint("UseSparseArrays")
private HashMap<Integer, View> hMap = new HashMap<>();
public PlaceholderFragment() {
}
/**
* Returns a new instance of this fragment for the given section
* number.
*/
public static TravelInfoActivity.PlaceholderFragment newInstance(int sectionNumber) {
TravelInfoActivity.PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
int fragmentLayout;
switch (sectionNumber) {
case 1:
fragmentLayout = R.layout.fragment_accommodation;
break;
case 2:
fragmentLayout = R.layout.fragment_visited_places;
break;
case 3:
fragmentLayout = R.layout.fragment_additional_info;
break;
default:
fragmentLayout = R.layout.fragment_accommodation;
}
args.putInt(ARG_FRAGMENT_ID, fragmentLayout);
fragment.setArguments(args);
return fragment;
}
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final View rootView = inflater.inflate(getArguments().getInt(ARG_FRAGMENT_ID), container, false);
currentRootView = rootView;
switch (getArguments().getInt(ARG_FRAGMENT_ID)) {
// switch handling here, not relevant
}
return rootView;
}
1 ответ
Ребята, я сделал это освежил мой мозг;)
Просто сохраните экземпляр из фрагмента в массив, и вы сможете использовать его позже. Я сделал это в SectionPageAdapter и перешел на метод instantiateItem()
,
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
private SparseArray<Fragment> registeredFragments = new SparseArray<>();
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
Integer fragmentId = fragment.getArguments().getInt("fragment_id");
registeredFragments.put(fragmentToPageMap.get(fragmentId), fragment);
return fragment;
}
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
public boolean registeredFragmentExists(int position) {
if(registeredFragments.size() >= position) {
if(registeredFragments.get(position) != null) {
return true;
}
}
return false;
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return TravelInfoActivity.PlaceholderFragment.newInstance(position);
}
@Override
public int getCount() {
return maxTabs;
}
}
Позже вы можете получить доступ к фрагментам rootView с помощью
mSectionsPagerAdapter.getRegisteredFragment(position);
fragment.getActivity().findViewById(id);