45 votes

Duplication de fragments sur une transaction de fragments

Ok, à chaque fois que j'ai essayer de remplacer un fragment de mon application, il ajoute que le fragment à l'intérieur du conteneur à l'autre fragment, et place le fragment. J'ai essayé d'appeler le remplacer et faisant référence à la vue de l'contient le fragment, et par référence au fragment de lui-même. Aucune de ces travaux. Je peux ajouter un fragment d'un point de vue avec le fragment du gestionnaire de transactions, mais même si j'essaie de le supprimer après son été ajoutés, il ne marche pas. Toute aide serait appréciée. Voici mes fichiers.

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //Setup the actionabar. Use setDrawableBackground to set a background image for the actionbar.
    final ActionBar actionbar = getActionBar();
    actionbar.setDisplayShowTitleEnabled(false);
    actionbar.setDisplayUseLogoEnabled(true);
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionbar.addTab(actionbar.newTab().setText(R.string.home_tab_text).setTabListener(this),true);
    actionbar.addTab(actionbar.newTab().setText(R.string.insert_tab_text).setTabListener(this));

    Fragment fragment = new insert_button_frag();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.button_fragment, fragment);
    transaction.addToBackStack(null);

    transaction.commit();
}

Ici est la mise en page

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
    android:orientation="vertical"
    android:id="@+id/button_fragment_container"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >
    <fragment
    android:name="com.bv.silveredittab.home_button_frag"
    android:id="@+id/button_fragment"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" /> 
</LinearLayout>

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
<fragment
    android:name="com.bv.silveredittab.quick_insert_frag"
    android:id="@+id/quick_insert_frag"
    android:layout_width="350dip"
    android:layout_height="fill_parent" />
<fragment
    android:name="com.bv.silveredittab.editor_frag"
    android:id="@+id/editor_frag"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />


</LinearLayout>
</LinearLayout>

Et voici le fragment de code

public class insert_button_frag extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    return inflater.inflate(R.layout.insert_buttons,container, false);
}
}

Comme je l'ai dit. J'ai essayé de référencement sur les fragments de la vue parente pour le remplacer, et le fragment lui-même (par id) et encore, il ajoute que le nouveau fragment, à l'intérieur du contenant afficher le fragment d'origine est en.

34voto

Damian Points 4588

J'ai résolu ce problème en utilisant un espace réservé dans ma mise en page, puis en y attachant mon fragment au moment de l'exécution.

Comme vous, si j'instanciais mon Fragment dans ma mise en page XML, le contenu resterait visible après l'avoir remplacé par un autre Fragment au moment de l'exécution.

18voto

Brian Cooley Points 6094

Le problème vient de cette ligne:

transaction.replace(R.id.button_fragment, fragment);

replace a deux formes surchargés. Dans deux d'entre eux, le premier argument est le conteneur du Fragment à être remplacé, pas le Fragment lui-même. Donc, dans votre cas, vous devez appeler

transaction.replace(R.id.button_fragment_container, fragment);

edit: je vois dans votre question que vous avez essayé les deux. J'ai testé et vérifié le comportement. Cela semble être un bug dans le FragmentTransaction API.

Edit2: pas un bug, après tout. Vous simplement ne peut pas remplacer les fragments ajoutés de façon statique dans un fichier de mise en page. Vous ne pouvez remplacer ceux que vous avez ajoutés par programmation ( Android: ne peut pas remplacer un fragment à un autre )

2voto

Peter Points 514

J'ai eu le même problème. Jetez un oeil à ce lien: Android Fragment de Duplication

Je me demande si le fait que vous êtes de passage le récipient dans le inflater.inflate() la méthode la provoque pour créer le nouveau fragment à l'intérieur de l'ancien au lieu d'un gros remplacer. J'ai été la fourniture de 'null', à mon inflaters dans la version de travail.

Voici l'essentiel à partir de la version que j'ai de travail...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
   View newFrag = new View(getActivity().getApplicationContext());
   newFrag = inflater.inflate(R.id.frag, null);
   return newFrag;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X