I want to create same fragment multiple times in view pager with different arguments how can i do it?
Now i have a static single argument constructor in a fragment which i call to initialize the fragment
Is there a simple way to do this.
You could use setArguments() method, for each of your Fragment. Do something like this:
Fragment myFragment = new Fragment();
Bundle data = new Bundle();
data.putString("data_1","Hello");
myFragment.setArguments(data);
Then in your Fragment, do this:
Bundle data = getArguments();
String data_1 = data.getString("data_1");
Related
I need to pass some variable from activity to fragment inside a tab layout. I found there are 2 preferred ways of passing argument bundles to the fragment by its initialization methods for the tab layout.
By creating static newInstance() method and providing details.
Creating instance of fragment inside FragmentPagerAdapter
But, I have some doubts how this works.
If I create this this is:
public class SectionsPagerAdapter extends FragmentPagerAdapter {
MyFragment myFragment;
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
myFragment = new MyFragment();
Bundle args = new Bundle();
args.putString("id", id);
myFragment.setArguments(args);
}
// ...
}
Here I am creating the instance of fragment and setting its argument afterwords.
And if I create it in newInstance() method something like this:
public static MyFragment newInstance(String id) {
MyFragment myFragment = new MyFragment();
Bundle args = new Bundle();
args.putString("id", id);
myFragment.setArguments(args);
return myFragment;
}
Some doubts:
When will the onCreate() or onCreateView() will be called? What if after line new MyFragment() and before setting bundle?
Is there any possibility where getArguments can return null?
In both ways I am doing the same thing. Setting args after new MyFragment() call. How late I can set the arguemnts. Is it necessary to set arguments exactly after the new MyFragment() call?
Sorry, if I asked some silly question. But I am new to Fragments. Thanks :)
onCreate() and onCreateView() will be called sometime after you've committed the fragment transaction. i.e. called commit(). And you set bundle before that.
As long as you're setting bundle before commit, getArguments shouldn't be null.
Both are doing the same thing. In 1st you're creating the fragment instance by yourself and setting bundle yourself. In 2nd you're using what is called a factory method (Effective Java Item 2) which is managed by your fragment. So it's difficult to make mistake in 2nd as arguments are always set.
So basically I'm using same type of fragment in two different activities and I want to create and initialize some variable in the fragment only if it was added from specific activity. My question is how can I programmatically find out in which activity the fragment was added.
there're two main ways of achieving it:
the less modular approach, you simply check using instanceof
if(getActivity() instanceof MyActivity)
and the more modular approach, you pass some arguments to the fragment on the moment you'll add it to the transaction:
// this during the transaction to pass extra parameters to the fragment
Fragment f = new MyFragment();
Bundle b = new Bundle();
b.putBoolean("doExtraCode", true);
f.setArguments(b);
then inside the fragment:
// check if should execute extras
Bundle b = getArguments();
boolean doExtraCode = b == null? false: b.getBoolean("doExtraCode", false);
I have an activity that calls to a web service and I want to pass these result to a fragment. Obviously the web service is invoked by an AsyncTask, so the fragment is loaded before getting result.
How can I pass this paramteter from activity's AsyncTask to fragment when is received?
You can implement a method inside your Fragment and call it when needed. For bidirectional communication between an Activity and a Fragment see http://developer.android.com/training/basics/fragments/communicating.html
Set bundle in your fragment.
Bundle args = new Bundle();
args.putInt("id",value);
Fragment newFragment = new Fragment();
newFragment.setArguments(args);
In your fragment get the bundle as
Bundle b = getArguments();
String s = b.getInt("id");
You could move the AsyncTask into the fragment.
But if you wish to keep your current set up, you should save the Fragment reference when you initialize it, and create a public function in the fragment that takes the new data as a parameter.
So the activity code could look like this:
MyFragment fragment = new MyFragment();
getFragmentManager().beginTransaction().replace(android.R.id.content, fragment).commit();
and then you could call:
fragment.updateData(myNewData);
Just make sure to do the appropriate null-checks, just to be safe.
I currently have this Custom ArrayList:
ArrayList<PlaceDetails> place_list = new ArrayList<PlaceDetails>();
which will be populated during the onCreateView() portion.
I am unsure as of how do I pass this ArrayList in a bundle from this fragment class to another fragment class. Below is the snippet of my codes:
public void Map(View view){
if(hasConnection() == true){
Bundle b = new Bundle();
// how should I be passing the ArrayList in this bundle?
FragmentTransaction ft = getSherlockActivity().getSupportFragmentManager().beginTransaction();
TOnlineMapViewFragment mapfrag = TOnlineMapViewFragment.newInstance(b);
ft.replace(R.id.container, mapfrag).addToBackStack(null).commit();
}
}
So I've created the bundle and I wanted to pass it to the next fragment with the newInstance() method. How should I do this?
Consider implementing Parcelable interface in your classes. Then you would be able to store PlaceDetails in Bundle and pass it to setArguments() method.
I've found a tutorial: http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/
I haven't testes it but it looks good.
Are you really sure a bundle is really needed?
TOnlineMapViewFragment mapfrag = TOnlineMapViewFragment.newInstance(b);
mapfrag.setPlaceList(place_list)
Should be trivial to create setPlaceList(ArrayList<PlaceDetails> place_list) ...
How can we send data from actvity to fragment? The Fragments are configured to actvity by using FragmentPagerAdapter.
Regards
mini.
You can pass a bundle to the fragment on creation with setArguments.
You can create methods to set the data on the Fragment class.
You can perform this by using Bundle
Send data from the activity (or fragment) :
int a = 5;
Bundle args = new Bundle();
args.putInt("INT_DATA_TAG", a);
Fragment fragment = Fragment.newInstance(args);
//Making fragment transaction
Retrieve data in the fragment
int a;
public static Fragment newInstance(Bundle args) {
a = args.getInt("INT_DATA_TAG"); //use a constant for the tag
return new Fragment();
}