2016-03-16 1 views
3

Je suis dans ma classe de fragment appeler ceci:Envoyer des données à fragmenter avec FragmentTransaction

@OnClick(R.id.blockedLinkLayout) 
public void onBlockedClick(){ 
    final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.replace(R.id.content, new SettingsBlockedUsersFragment(), FRAGMENT_TAG); 
    ft.commit(); 
} 

Et REMPLACER juste mon fragment courant avec un choisi. Et ma question est, comment puis-je envoyer des données (par exemple String valeur) de mon fragment parent à mon fragment enfant en utilisant FragmentTransaction?

Répondre

11

les passer juste dans un paquet comme arguments de fragments

dans le fragment parent:

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(); 

dans le fragment d'enfant:

Bundle arguments = getArguments(); 
String desired_string = arguments.getString(string_key); 
+0

ça marche! Que faire si je veux envoyer par exemple HashMap oraz ArrayList? – y07k2

+0

vous pouvez utiliser arguments.putStringArrayList (clé, valeur); . Notez que bundle est limité à des valeurs simples comme String ou int. – Mahfa

+0

Donc j'ai besoin de changer de type de bundle pour quoi? – y07k2

1

FragmentTransaction est simplement de transiter des fragments, il ne "passe" rien. Vous devez utiliser un 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(); 

Puis à l'intérieur du onCreate du fragment, vous pouvez faire

String user = getArguments().getString("user"); 

D'autres façons de transmettre des données dans un fragment sont discutées à Best practice for instantiating a new Android Fragment

+0

Je pense que vous voulez dire '' FragmentTransaction' ne FragmentTransition' –

0

vous pouvez utiliser une méthode de fabrication dans votre classe de fragments (tel que recommandé dans la documentation)

public static YourFragment newInstance(String sample) { 
    YourFragment fragment = new YourFragment(); 
    Bundle args = new Bundle(); 
    args.putString(KEY, sample); 
    fragment.setArguments(args); 
    return fragment; 
} 

puis appelez YourFragment.newInstance ("string vous devez passer "); pour obtenir une instance de votre fragment et l'utiliser dans votre transaction.

La clé utilise actuellement la méthode setArguments() pour transmettre des données. vous pouvez récupérer ces données dans la méthode oncreate comme celui-ci

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     streamSource = getArguments().getParcelable(KEY); 
    } 
} 
0

Dans votre SettingsBlockedUsersFragment classe ont une méthode statique comme ce qui suit

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); 
      } 
    } 
} 

Dans votre transaction fragment de votre fragment, vous pouvez passer les args comme celui-ci

final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.content,SettingsBlockedUsersFragment.newInstance("my string"), FRAGMENT_TAG); 
ft.commit();