user233804
user233804

Reputation: 53

Pass value Pager Fragment

I had a problem with passing the value to my class:

public class FragmentViewPager extends Fragment {

    public static int p;
    private FragmentPagerItemAdapter adapter;
    private static final String TAG = "log";

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

        adapter = new FragmentPagerItemAdapter(
                    getChildFragmentManager(), FragmentPagerItems.with(getActivity())
                    .add("1", AnimalsFragment.class)
                    .add("2", AnimalsFragment.class)
                    .add("3", AnimalsFragment.class)
                    .add("4", AnimalsFragment.class)
                    .add("5", AnimalsFragment.class)
                    .create());

        ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager);
        viewPager.setAdapter(adapter);

        SmartTabLayout viewPagerTab = (SmartTabLayout) view.findViewById(R.id.viewpagertab);
        viewPagerTab.setViewPager(viewPager);

        // определяем позицию фрагмента
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

            @Override
            public void onPageSelected(int position) {
                p = position;
            }

            @Override
            public void onPageScrollStateChanged(int state) {}
        });

        return view;
    }
}

I get the value:

public class AnimalsFragment extends Fragment implements View.OnClickListener {
...
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_animals, container, false);

        // получаем позицию фрагмента
        position = FragmentViewPager.p;
        Log.i(TAG, "position = " + position);
...

Logs:

I/log: position = 1
I/log: position = 2
I/log: position = 3

There are 5 fragments, the first '0' and last '4' are not displayed. But if you place logs in the method onPageSelected() logs are displayed correctly. How to correctly convey the values of paging in a class?

Upvotes: 1

Views: 96

Answers (1)

savepopulation
savepopulation

Reputation: 11921

ViewPager creates current, previous and next fragments which you can set and change the number with ViewPager's setOffscreenPageLimit method. (The default is 1. You cannot set it to 0.)

So when you put your Log code in onCreateView, 3 of your Fragments will be created and you'll see the log three times and your p variable will be last created fragment's position since your default screen limit is 1.

And when you put your Log code in onPageSelected your log only'll work when you swipe the ViewPager.

Here you can check for more detail: https://developer.android.com/reference/android/support/v4/view/ViewPager.html

Upvotes: 1

Related Questions