2017-08-15 2 views
0

J'utilise recyclerview dans mon application. Je veux commencer un fragment en cliquant sur l'image. Mais je ne sais pas comment. Aussi je veux mettre des données lors du démarrage du fragment. Je sais comment démarrer l'activité avec le code ci-dessous. Mais comment puis-je commencer fragment de la même manière?Comment démarrer Fragment à partir de onClick

Modifié le Code

FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.layoutContent, frag); 
    ft.commit(); 
+0

J'ai édité mon code. Mais comme mentionné ici, je ne voudrais pas essayer de remplacer le fragment d'une autre activité. – Ch4t4r

Répondre

0

Des fragments ne peuvent pas être démarrés, ils doivent être ajoutés à un conteneur.
Les fragments ne sont pas destinés à fonctionner seuls, ils ont besoin d'une activité englobante.

Avoir la disposition suivante:

[...] 
    <FrameLayout android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="?android:attr/detailsElementBackground" /> 
    [...] 

Vous placez le fragment comme tel:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
transaction.replace(R.id.container, newFragment); 
transaction.commit(); 

Vous passez des arguments au fragment en utilisant Bundle et en créant le fragment comme suit:

TestFragment newFragment = new TestFragment(); 
Bundle args = new Bundle(); 
args.putString("Hello world!"); 
newFragment.setArguments(args); 

Ceci doit être fait avant la transaction.

Pour plus d'information consultez le official documentation



Remarque sur le code édité: vous devez appeler la transaction à l'intérieur de l'activité du FrameLayout fait partie.
Vous pouvez également utiliser une solution de contournement plutôt sale: à Main:

public class Main extends Activity{ 
    public static Main currentInstance; 

    public void onCreate(Bundle boomerang){ 
    currentInstance = this; 
    } 
} 

Dans l'activité Playlist puis utilisez Main.currentInstance.getSupportFragmentManager() etc.
Mais je ne le recommanderais pas.

+0

Bon, j'ai une autre question. Je veux commencer un fragment de l'activité de playlist mais le fragment est dans l'activité principale. Si j'utilise FragmentTransaction, il donne l'erreur "Aucune vue trouvée pour l'ID pour le fragment" –

+0

Pourriez-vous s'il vous plaît poster votre code actuel dans votre question? Votre fragment est-il dans l'ensemble principal avec 'public static class NameOfFragment'? – Ch4t4r

+0

J'ai mis à jour le code, l'erreur est due à layoutContent qui dans la mise en page Mainactivity. Et j'essaye de le changer d'activité de playlistdetails. –

0

Pour démarrer un fragment, vous devez utiliser le gestionnaire de fragments.

YourFragment yourFragmentInstance = YourFragment.newInstance("Hello", 12); 
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
//Fragment is hosted by an activity, and the activity must have a layout 
//or a container for the fragment to be nested in, in this case it will be 
//a FrameLayout with an id fragment_container 
fragmentTransaction.replace(R.id.fragment_container, yourFragmentInstance); 
fragmentTransaction.commit(); 

Et vous pouvez passer des arguments à votre fragment comme celui-ci:

public class YourFragment extends Fragment { 

    public static YourFragment newInstance(String paramOne, int paramTwo) { 
     YourFragment fragment = new YourFragment(); 
     Bundle b = new Bundle(); 
     //set params/arguments for fragment 
     b.putString("param_one", paramOne); 
     b.putInt("param_two", paramTwo); 
     fragment.setArguments(b); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //Get the params you passed in 
     Bundle bundle = getArguments(); 
     String paramOne = bundle.getString("param_one"); 
     String paramTwo = bundle.getInt("param_two"); 
    } 
} 

Note: Je ne l'ai pas testé ce code .. Ceci est juste une idée :)