Фрагмент с 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();
}
Моя реализация интерфейса полностью функциональна, поэтому я чувствую, что, возможно, не правильно храню фрагменты в моем окне просмотра.