Send values from ViewPager Activity to a Fragment by bundle

23,121

Solution 1

You have to set your Bundle through setArguments() method, not the intent. If you have a ViewPager, you can pass your arguments to the PagerAdapter, and set the arguments when the Fragment is being instantiated.

I don't get how your SIDE is calculated and what does it mean, so I show the general ide.

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_screen_slide);
    Bundle bundle = new Bundle();
    bundle.putInt("SIDE",2);
    mPager = (ViewPager)findViewById(R.id.pager);
    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager(), bundle);
    mPager.setAdapter(mPagerAdapter);
}


private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{

    private final Bundle fragmentBundle;

    public ScreenSlidePagerAdapter(FragmentManager fm, Bundle data){
        super(fm);
        fragmentBundle = data;
    }

    @Override
    public ScreenSlidePageFragment getItem(int arg0) {
        final ScreenSlidePageFragment f = new ScreenSlidePageFragment();
        f.setArguments(this.fragmentBundle);
        return f;
    }

    @Override
    public int getCount() {
        return  NUM_PAGES;
    }
}

Fragment

@Override
public void onCreate(Bundle state) {
    super.onCreate(state);
    final Bundle args = getArguments();
    final int side = args.getInt("SIDE");
}

Solution 2

This might not be the solution you are exactly asking for but it is what I do and it may help someone:

Create a public method in your fragment:

public void doSomething(String myValue){
     // Do stuff in your fragment with myValue
}

In your activity, get the fragment from your Adapter. You know which fragment it is based on order it was added in. Execute your fragment method, passing in your variable(s):

// Get FriendsFragment (first fragment)
MyFragment fragment = (MyFragment) mAdapter.getItem(0);
fragment.doSomething("some-value");
Share:
23,121
Ricardo Filipe
Author by

Ricardo Filipe

Updated on August 03, 2020

Comments

  • Ricardo Filipe
    Ricardo Filipe almost 4 years

    I have an ViewPager Activity that call the fragment that represent the slide layout.

    What i need is pass values from activity to fragment by bundle. How i can do this? I try pass a int 2 in onCreate() but not work and i

    Activity:

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screen_slide);
        Intent intent = new Intent(this,ScreenSlidePageFragment.class);
        Bundle bundle = new Bundle();
        bundle.putInt("SIDE",2);
        intent.putExtras(bundle);
    /**
     * Instantiate a ViewPager and a PagerAdapter
     */
    
        mPager = (ViewPager)findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);
        mPager.setOnPageChangeListener(new OnPageChangeListener() {
    
            @Override
            public void onPageSelected(int arg0) {
                if(itemOld > arg0){
                    auxBack--;
                    SIDE=1;
                }
                else if(itemOld < arg0){
                    auxFront++;
                    SIDE=0;
                }
            }
    
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub
    
            }
        });
    }
    
    @Override
    public void onBackPressed(){
        if(mPager.getCurrentItem()==0){
            super.onBackPressed();
        }else{
            mPager.setCurrentItem(mPager.getCurrentItem()-1);
        }
    } 
    
    
    /**
     * A simple pager adapter that represents 5 ScreenSlidePageFragment objects, in sequence
     */
    
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{
        public ScreenSlidePagerAdapter(FragmentManager fm){
            super(fm);
        }
    
        @Override
        public ScreenSlidePageFragment getItem(int arg0) {
            return new ScreenSlidePageFragment();
        }
    
        @Override
        public int getCount() {
            //Toast.makeText(getApplicationContext(), "Num pages " + NUM_PAGES, Toast.LENGTH_LONG).show();
            return  NUM_PAGES;
        }
    }
    

    }

    Fragment:

        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle    savedInstanceState) {
    
        int tID = ((ScreenSlidePagerActivity)getActivity()).getIntent().getExtras().getInt("SIDE");
        Toast.makeText(getActivity(), "Side selected....." +tID,   Toast.LENGTH_LONG).show();