How to send data from Activity to Fragment
Solution 1
Usually the activities will have a reference to their fragments. In your SearchableActivity.java
are you also loading PlaceListFragment.java
either in setContentView(activity_searchable.xml);
or you need to create a instance of the fragment and add/replace a fragment using FragmentTransaction
.
you can find a good example here on how to communicated between fragments or between activity & fragment.
Solution 2
Find fragment in Activity onCreate and set data to a method you write in your fragment:
ExampleFragment rf = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.exampleFragment);
if(rf!=null){
rf.setExample(currentExample);
}
"CurrentExample" is whatever you want to send in to your "setExample" method in your fragment.
public void setExample(ExampleObject currentExample){
currentExampleInFragment = currentExample;
}
You can use the data in onActivityCreated method of Fragment.
Not sure is this is a good solution or not, but I found it the easiest one for passing objects.
Solution 3
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
and in Fragment onCreateView method:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String strtext = getArguments().getString("edttext");
return inflater.inflate(R.layout.fragment, container, false);
}
see detail answer here..
Solution 4
"send data from Activity to Fragment"
Activity:
Bundle bundle = new Bundle();
bundle.putString("message", "Alo Stackoverflow!");
FragmentClass fragInfo = new FragmentClass();
fragInfo.setArguments(bundle);
transaction.replace(R.id.fragment_single, fragInfo);
transaction.commit();
Fragment:
Reading the value in the fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle bundle = this.getArguments();
String myValue = bundle.getString("message");
...
...
...
}
or
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
String myValue = this.getArguments().getString("message");
...
...
...
}
Solution 5
Create one Session model class and in Activity set the values you want to data needs to be send then in Fragment you can get that values from Session model class
eg. from your activity u can set like this.
AllEventDetails.getInstance().setEvent_description(event_Description);
AllEventDetails.getInstance().setDj_name(dj_name);
AllEventDetails.getInstance().setMusic_theme(music_theme);
AllEventDetails.getInstance().setClub_name(club_name);
AllEventDetails.getInstance().setDate(event_date);
AllEventDetails.getInstance().setBanner_image_path(banner_image_path);
AllEventDetails.getInstance().setEvent_title(event_title);
and from your Fragment u can retrive like this.
AllEventDetails.getInstance().getClub_name()
.........
Creating Session model class is like this.
public class AllEventDetails {
private static AllEventDetails mySession ;
private String event_description;
private String dj_name;
private String music_theme;
private String club_name;
private String date;
private String banner_image_path;
private String event_title;
private AllEventDetails() {
event_description = null;
dj_name = null;
music_theme = null;
club_name = null;
date = null;
banner_image_path = null;
event_title = null;
}
public static AllEventDetails getInstance() {
if( mySession == null ) {
mySession = new AllEventDetails() ;
}
return mySession ;
}
public void resetSession() {
mySession=null;
}
public String getEvent_description() {
return event_description;
}
public void setEvent_description(String event_description) {
this.event_description = event_description;
}
public String getDj_name() {
return dj_name;
}
public void setDj_name(String dj_name) {
this.dj_name = dj_name;
}
public String getMusic_theme() {
return music_theme;
}
public void setMusic_theme(String music_theme) {
this.music_theme = music_theme;
}
public String getClub_name() {
return club_name;
}
public void setClub_name(String club_name) {
this.club_name = club_name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getBanner_image_path() {
return banner_image_path;
}
public void setBanner_image_path(String banner_image_path) {
this.banner_image_path = banner_image_path;
}
public String getEvent_title() {
return event_title;
}
public void setEvent_title(String event_title) {
this.event_title = event_title;
}
}
tsil
Updated on May 04, 2020Comments
-
tsil about 4 years
I know there are many topics about this here. I have also read documentation many times but I can't find the best way to pass data from activity to fragment.
I want to be able to show the results of my Searchable activity in two differents layouts (list and map) using swipe Views with tabs. I have to pass 2 data to the fragments: "currentLocation" which is the current user location and "result" which is a list of objects.
I have omited some parts of my code to make it more understandable.
SearchableActivity.java
public class SearchableActivity extends ActionBarActivity implements TabListener { List<PlaceModel> result = new ArrayList<PlaceModel>(); private SearchView mSearchView; private String currentLocation; AppSectionsPagerAdapter mAppSectionsPagerAdapter; ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_searchable); final ActionBar actionBar = getSupportActionBar(); actionBar.setHomeButtonEnabled(true); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager()); mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mAppSectionsPagerAdapter); mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); } }); actionBar.addTab(actionBar.newTab().setText("List").setTabListener(this)); actionBar.addTab(actionBar.newTab().setText("Map").setTabListener(this)); // get currentLocation here handleIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { handleIntent(intent); } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { final String query = intent.getStringExtra(SearchManager.QUERY); // get result here } } @Override public void onTabReselected(Tab arg0, FragmentTransaction arg1) { // TODO Auto-generated method stub } @Override public void onTabSelected(Tab tab, FragmentTransaction arg1) { mViewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab arg0, FragmentTransaction arg1) { // TODO Auto-generated method stub }
}
PlaceListFragment.java
public class PlaceListFragment extends Fragment { ListView listViewData; PlaceAdapter placeAdapter; List<PlaceModel> result = new ArrayList<PlaceModel>(); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_list, container, false); Bundle args = getArguments(); listViewData = (ListView) rootView.findViewById(android.R.id.list); // I will pass result and currentLocation here placeAdapter = new PlaceAdapter(getActivity(), R.layout.fragment_list_item, result, currentLocation); listViewData.setAdapter(placeAdapter); return rootView; } }
AppSectionsPagerAdapter.java
public class AppSectionsPagerAdapter extends FragmentPagerAdapter { final int PAGE_COUNT = 2; public AppSectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int arg0) { Bundle data = new Bundle(); switch(arg0) { case 0: PlaceListFragment fragment1 = new PlaceListFragment(); fragment1.setArguments(data); return fragment1; default: PlaceListFragment fragment2 = new PlaceListFragment(); fragment2.setArguments(data); return fragment2; } } @Override public int getCount() { return PAGE_COUNT; } }
-
tsil over 10 yearsactivity_searchable.xml contains ViewPager only. I create another layout (fragment_list.xml and fragment_list_item.xml) for PlaceListFragment.
-
prijupaul over 10 yearsFrom your code, What i understand is you are not populating the fragments to the mAppSectionsPagerAdapter. Once you have added the PageListFragment you would get a reference of it from getItem. No need to create a new instance of PAgeListFragment. Check this example on how it works. thepseudocoder.wordpress.com/2011/10/13/…
-
prijupaul over 10 yearsPls update your latest code. Did you add the fragment instance to your viewpager adapter? This is also a good example to take a look. developer.android.com/reference/android/support/v4/view/…
-
tsil over 10 yearsI'm now able to pass data to my fragments. But I have noticed it's possible only via FragmentPagerAdapter. Like this in getItem method Bundle data = new Bundle(); data.putString("my_key", "test"); But it doesn't solve my problem. I search a way to pass objects from Activity to the FragmentPagerAdapter.
-
Arun Badole almost 9 yearsCan you please have a look at my issue.. stackoverflow.com/questions/30303488/…
-
AJW over 3 years@Jorgesys Is there a benefit to using "transaction.replace(R.id.fragment_single, fragInfo); transaction.commit();" on the fragment you show in the Activity? I have just been using "fragment.show(getSupportFragmentManager(), "fragmentname");"