web-dev-qa-db-fra.com

Fragment de charge dans l'activité OnCreate

Problème : Passage du fragment 1 au fragment 2, le changement a lieu, mais les deux sont visibles. (le fragment 2 entre en scène)

Le fragment 1 est MenuFragment Le fragment 2 est GameFragment

Je crois que cela se produit parce que mon fragment 1 est inclus dans mon activité principale.xml

   <fragment
        Android:id="@+id/menu_fragment"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        tools:layout="@layout/fragment_menu">
    </fragment>

Le code ci-dessus dans main.xml charge le fragment dans l'activité principale. Chaque fois que je remplace le fragment de menu par fragment de jeu en utilisant ce code:

public void replaceFragment(Fragment fragment) 
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.gameview_layout, gameFragment);
    fragmentTransaction.addToBackStack(fragment.toString());
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    fragmentTransaction.commit();
}

le fragment de jeu apparaît et se superpose au-dessus du fragment de menu. Comment faire pour que le fragment de menu disparaisse? Je suis sûr que la solution la plus simple serait makeVisible (false) ou quelque chose de similaire, mais je pense que le vrai problème est de programmer dans le fichier xml pour inclure le MenuFragment en premier lieu.

Question : Comment programmer dans la classe main.Java pour charger un fragment sur create?

Je veux faire cela, donc je peux le programmer pour charger le fragment 1 (MenuFragment) en premier sans qu'il soit déjà là. La seule raison pour laquelle les deux sont visibles est que le fragment 1 est inclus dans mon fichier main.xml

3
Jason J

Au lieu de créer deux fragments, vous devez créer un seul FrameLayout (ou un autre) et remplacer la disposition du cadre lors de la commutation, comme dans l'exemple ci-dessous.

XML

<FrameLayout
    Android:id="@+id/frameContainer"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"/>

Java

public void replaceFragment(Fragment fragment) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.frameContainer, fragment);
    fragmentTransaction.addToBackStack(fragment.toString());
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    fragmentTransaction.commit();
}
7
Sagar Chapagain

Essayez d’utiliser une mise en page telle que LinearLayout ou FrameLayout comme conteneur pour vos fragments et dans onCreate, créez quelque chose comme:

getFragmentManager().beginTransaction()
    .add(R.id.menu_fragment, MenuFragment.getInstance())
    .commit();

et renommez le conteneur id en "@ + id/fragmentContainer" ou quelque chose de similaire.

1
Morya Yaroslav

Dans votre mise en page de fragment XML, ajoutez un background color pour résoudre le problème.

1
Giacomo Lai

Java

public void loadFragment(Fragment fragment) {
    String backStateName = fragment.getClass().getName();
    FragmentManager fragmentManager = getSupportFragmentManager();
    boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
    if (!fragmentPopped) {
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.frameContainer, fragment);
        fragmentTransaction.addToBackStack(backStateName);
        fragmentTransaction.commit();
    }
}

XML

<FrameLayout
    Android:id="@+id/frameContainer"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"/>

0
Ashish Satpute