Фрагмент с ViewPager, который содержит список фрагментов; функция setCurrentItem в ViewPager перестает работать после того, как я оставляю фрагмент хоста

Моя программа разработана таким образом, что список фрагментов размещается в MainActivity и просматривается с помощью библиотеки контроллера FragNav. Один из моих основных фрагментов имеет ViewPager, который содержит два других фрагмента. Я реализовал интерфейс OnClick, который переключает фрагменты в ViewPager на основе нажатия кнопки.

Если я переключаюсь от своего основного фрагмента и возвращаюсь к нему, ViewPager заполняется последним посещенным фрагментом и нажимает соответствующую кнопку, чтобы вернуться к предыдущему фрагменту в работах ViewPager (то есть интерфейс отвечает и код выполняется успешно). Однако, когда ViewPager.setCurrentItem() вызывается в моем FragmentStatePagerAdapter, ViewPager не возвращается к предыдущему фрагменту.

Более конкретно, mViewPager.setCurrentItem(), похоже, не выполняет никаких действий в моем FragmentStatePagerAdapter.

Вот мой FragmentStatePagerAdapter; реализует мой интерфейс OnClickListener:

class ViewPagerAdapter extends FragmentStatePagerAdapter implements GeneralInformationClickListener {

    private List<Fragment> mFragments = new ArrayList<>();
    private ViewPager mViewPager;

    ViewPagerAdapter(ViewPager pViewPager, FragmentManager pFragmentManager) {
        super(pFragmentManager);
        mViewPager = pViewPager;

        // Create a new fragments needed for profile
        // passing 'this' an instance of an GeneralInformationClickListener
            mFragments.add(MainProfileFragment.newInstance(this));
        mFragments.add(GeneralInformationFragment.newInstance(this));
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    /**
     * Handles what should happen when a button is
     * clicked within a fragment.
     *
     * This method cycles through all the fragments
     */
    @Override
    public void onNextClick() {
        if (mFragments.size() <= 1) {
            // No fragments to cycle between
            return;
        }

        if (mFragments.size() - 1 == mViewPager.getCurrentItem()) {
            // We're at the last fragment, start at beginning
            mViewPager.setCurrentItem(0, true);
        } else {
            // Go to the next fragment
            mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1, true);
        }
    }
}

Вот мой основной фрагмент, который содержит ViewPager и устанавливает его адаптер:

public class ProfileFragment extends Fragment {

    NonSwipeableViewPager mViewPager;

    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.profile_fragment, container, false);

        mViewPager = (NonSwipeableViewPager) view.findViewById(R.id.profileViewPager);

        mViewPager.setAdapter(new ViewPagerAdapter(
                mViewPager,
            getChildFragmentManager()));

    return view;
}

}

И вот первый фрагмент, который содержит мой ViewPager:

 public class MainProfileFragment extends Fragment implements View.OnClickListener {

        public MainProfileFragment() {
            // Required empty public constructor
        }

        public static MainProfileFragment newInstance(GeneralInformationClickListener pListener) {
            MainProfileFragment fragment = new MainProfileFragment();
            fragment.setNextClickListener(pListener);
            return fragment;
        }

        private void setNextClickListener(GeneralInformationClickListener pListener) {
            mListener = pListener;
        }

        @Override
        public void onClick(View v) {
            // If the button was clicked, notify the listener
            if (v.getId() == R.id.generalInformation
                    && mListener != null) {
                mListener.onNextClick();
            }
        }


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            View view = inflater.inflate(R.layout.fragment_main_profile, container, false);

            // attach on click listener to the button
            Button generalInformation = (Button) view.findViewById(R.id.generalInformation);

            generalInformation.setOnClickListener(this);

            return view;
        }
    }

И второй фрагмент в моем ViewPager:

public class GeneralInformationFragment extends Fragment implements View.OnClickListener {

    private GeneralInformationClickListener mListener;

    public GeneralInformationFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @return A new instance of fragment GeneralInformationFragment.
     */
    public static GeneralInformationFragment newInstance(GeneralInformationClickListener pListener) {
        GeneralInformationFragment fragment = new GeneralInformationFragment();
        fragment.setNextClickListener(pListener);
        return fragment;
    }


    private void setNextClickListener(GeneralInformationClickListener pListener) {
        mListener = pListener;
    }

    /**
     * Check to see if the fragment is in focus and then add a back button if so
     * @param visible determines visibility of fragment
     */
    @Override
    public void setMenuVisibility(boolean visible) {
        super.setMenuVisibility(visible);

        if (visible) {
            toolbarIcon.setImageResource(R.drawable.ic_arrow_back_black_24px);
            toolbarIcon.setOnClickListener(this);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_general_information, container, false);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.wellness_icon
                && mListener != null) {

            // Remove back button
            toolbarIcon.setImageResource(R.drawable.wellness_icon);

            // Go to previous fragment
            mListener.onNextClick();
            toolbarIcon.setOnClickListener(null);

        }
    }
}

И наконец мой интерфейс on click:

public interface GeneralInformationClickListener {
    void onNextClick();
}

Моя реализация интерфейса полностью функциональна, поэтому я чувствую, что, возможно, не правильно храню фрагменты в моем окне просмотра.

0 ответов

Другие вопросы по тегам