问题
I'm in my fragment class calling this:
@OnClick(R.id.blockedLinkLayout)
public void onBlockedClick(){
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content, new SettingsBlockedUsersFragment(), FRAGMENT_TAG);
ft.commit();
}
And it just replace my current fragment with chosen one.
And my question is, how can I send some data (e.g. String
value) from my parent fragment to my child fragment using FragmentTransaction?
回答1:
Just pass them in a bundle as fragment arguments
in parent fragment :
SettingsBlockedUsersFragment fragment = new SettingsBlockedUsersFragment();
Bundle arguments = new Bundle();
arguments.putString( string_key , desired_string);
fragment.setArguments(arguments);
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content, fragment , FRAGMENT_TAG);
ft.commit();
in child fragment :
Bundle arguments = getArguments();
String desired_string = arguments.getString(string_key);
回答2:
FragmentTransaction
is simply to transition Fragments, it doesn't "pass" anything. You need to use a Bundle
.
SettingsBlockedUsersFragment frag = new SettingsBlockedUsersFragment();
Bundle b = new Bundle();
// put stuff into bundle...
b.putString("user", "steve");
// Pass the bundle to the Fragment
frag.setArguments(b);
// Use Fragment Transaction
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content, frag, FRAGMENT_TAG);
ft.commit();
Then inside the onCreate of the Fragment, you can do
String user = getArguments().getString("user");
Other ways to pass data into a Fragment are discussed at Best practice for instantiating a new Android Fragment
回答3:
you can use a factory method in your fragment class(as recommended in the docs)
public static YourFragment newInstance(String sample) {
YourFragment fragment = new YourFragment();
Bundle args = new Bundle();
args.putString(KEY, sample);
fragment.setArguments(args);
return fragment;
}
then call YourFragment.newInstance("string you need to pass"); to get an instance of your fragment and use that in your transaction.
The key here is actually using the setArguments() method to pass in data. you can then retrieve this data in your fragment's oncreate method like this
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
streamSource = getArguments().getParcelable(KEY);
}
}
回答4:
In your SettingsBlockedUsersFragment
class have a static method like the following
public class SettingsBlockedUsersFragment extends Fragment {
private static final String MY_STRING = "my_string";
public static SettingsBlockedUsersFragment newInstance(String yourStringValue){
SettingsBlockedUsersFragment frag = new SettingsBlockedUsersFragment();
Bundle args = new Bundle();
args.putString(MY_STRING, yourStringValue);
frag.setArguments(args);
return frag;
}
@Override
protected void onCreate(Bundle savedInstanceState){
Bundle args = getArguments();
if(args != null){
String myString = args.getString(MY_STRING);
}
}
}
In your fragment transaction you can pass the args like this
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content,SettingsBlockedUsersFragment.newInstance("my string"), FRAGMENT_TAG);
ft.commit();
来源:https://stackoverflow.com/questions/36041545/send-data-to-fragment-with-fragmenttransaction