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);