I have a MainActivity with two fragments. Fragment 1 is MapsFragment and fragment 2 is ListFragment. When I start the app I get the user location (lat and lon) from Fragment 1. What I also want to do is pass that data to Fragment 2, before it starts loading, before onCreateView is called in Fragment 2, so I can do stuff with lat and lon I receive from Fragment 1.
Usually I would send data from fragment to fragment using intent and sending it through activity, but my question is a bit more specific, because fragment 2 is loaded right after fragment 1, before I get the time to pass the data.
Some of the stuff I have tried includes: this, this, this, this, this, this, this,this
My MainActivity:
tabLayout = findViewById(R.id.sliding_tabs);
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_one)));
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_two)));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_FIXED);
viewPager = findViewById(R.id.viewpager);
adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
viewPager.setOffscreenPageLimit(2);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
// Step 2 - undo expand for collapsible toolbar
appBarLayout.setExpanded(true);
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
My PagerAdapter:
public class PagerAdapter extends FragmentStatePagerAdapter {
private int mNumOfTabs;
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new MapsFragment();
case 1:
return new ListFragment();
case 2:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
Now, this is how I pass lat and lon to MainActivity, after I get it in my MapsFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
Intent intent = new Intent(getActivity().getBaseContext(),
MainActivity.class);
intent.putExtra("latitude", latitude);
intent.putExtra("longitude", longitude);
getActivity().startActivity(intent);
...
}
Solution:
It is based on both answers and the comment. In my list fragment I called method only if lat and lon are not empty. And after I get lat and lon it is called again, I was using interface and a listener.
Better solution would be to rewrite my code and write it properly, as suggested in the comments.