Send data to fragment with FragmentTransaction

為{幸葍}努か 提交于 2020-05-11 05:58:28

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!