Mikk Mikk - 5 months ago 27
Android Question

Sending bundle data from main activity to fragment

I have an activity with to fragments on two tabs and I'm trying to send a variable from main class to fragment using bundle.

But i can't receive any information and I'm only getting null.

Thank you for your help!

public class DetailedInfo extends AppCompatActivity {

private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detailed_info);

/////INFO, I WANT TO SEND
InfoFragment fragment = new InfoFragment ();
Bundle args = new Bundle();
args.putString("key", "text i want to send" );
fragment.setArguments(args);
////


//TABS setup
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Create the adapter that will return a fragment for each of the two
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_detailed_info, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
return super.onOptionsItemSelected(item);

}


public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return PicturesFragment.newInstance(position + 1);
case 1:
return InfoFragment.newInstance(position + 1);


}
return null;

}

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

@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Pictures";
case 1:
return "Info";

}
return null;
}
}

public static class PicturesFragment extends Fragment {

private static final String ARG_SECTION_NUMBER = "section_number";

public static PicturesFragment newInstance(int sectionNumber) {
PicturesFragment fragment = new PicturesFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}

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

return detailedpictures;
}
}

public static class InfoFragment extends Fragment {

private static final String ARG_SECTION_NUMBER = "section_number";

public static InfoFragment newInstance(int sectionNumber) {
InfoFragment fragment = new InfoFragment ();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {
View detailedinfo = inflater.inflate(R.layout.fragment_detailed_info, container, false);

////INFO, I WANT TO RECEIVE
Bundle bundle = getArguments();
String customtext = bundle.getString("key");
TextView detailtext= (TextView)detailedinfo.findViewById(R.id.info);
detailtext.setText(customtext);
////

return detailedinfo;
}
}
}

Answer

Since you're not using the sectionNumber on your fragment I would suggest the following:

public static class InfoFragment extends Fragment {

public static InfoFragment newInstance(String value) {
    InfoFragment fragment = new InfoFragment ();
    Bundle args = new Bundle();
    args.putInt("key", value);
    fragment.setArguments(args);
    return fragment;
}

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {
    View detailedinfo = inflater.inflate(R.layout.fragment_detailed_info, container, false);

    ////INFO, I WANT TO RECEIVE
    Bundle bundle = getArguments();
    String customtext = bundle.getString("key");
    TextView detailtext= (TextView)detailedinfo.findViewById(R.id.info);
    detailtext.setText(customtext);
    ////

    return detailedinfo;
}

}

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

private InfoFragment infoFragment;
private PictureFragment picFragment;

public SectionsPagerAdapter(FragmentManager fm, InfoFragment infoFrg, PictureFragment picFrg) {
    super(fm);
    this.infoFragment = infoFrg;
    this.picFragment  = picFrg;
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return infoFragment;
        case 1:
            return picFragment;
    }
    return null;
}

and finally:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_detailed_info);

  /////INFO, I WANT TO SEND
  InfoFragment infoFragment = InfoFragment.newInstance("text I want to send");
  ////
  PictureFragment picFrament = PictureFragment.newInstance(0);

  //TABS setup
  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  setSupportActionBar(toolbar);
  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  // Create the adapter that will return a fragment for each of the two
  // primary sections of the activity.
  mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), infoFragment, picFragment);

  // Set up the ViewPager with the sections adapter.
  mViewPager = (ViewPager) findViewById(R.id.container);
  mViewPager.setAdapter(mSectionsPagerAdapter);

  TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
  tabLayout.setupWithViewPager(mViewPager);
}