2011-08-01 4 views
8

Je crée trois onglets qui contiennent chacun un fragment, maintenant je veux remplacer le premier fragment de tabulation par un nouveau fragment dans le même onglet. Comment puis-je faire cela avec l'onglet restant le même?Comment afficher un nouveau fragment dans un seul onglet?

Mon code -

Tab_Widget.java

public class Tab_Widget extends TabActivity { 

      TabHost tabHost; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.tab_host); 

      tabHost = getTabHost(); 

      tabHost.addTab(tabHost.newTabSpec("Tab1") 
       .setIndicator("Tab1") 
       .setContent(new Intent().setClass(this, main_activity.class))); 

      tabHost.addTab(tabHost.newTabSpec("Tab2") 
       .setIndicator("Tab2") 
       .setContent(new Intent().setClass(this, second_activity.class))); 

      tabHost.addTab(tabHost.newTabSpec("Tab3") 
        .setIndicator("Tab3") 
        .setContent(new Intent().setClass(this, third_activity.class))); 

      tabHost.setCurrentTab(0); 
     } 
    } 

main_activity.java

public class main_activity extends FragmentActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mainfragment); 
    } 
} 

main_fragment.java

public class main_fragment extends Fragment 
{ 
    LinearLayout mLayout; 
    Button mButton; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     mLayout = (LinearLayout) inflater.inflate(R.layout.main_view, null); 
     mButton = (Button) mLayout.findViewById(R.id.btn); 
     mButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Fragment mFragment = new third_fragment_view(); 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
//    ft.replace(R.id.Maincontainer, mFragment); 
       ft.replace(R.id.main_fragment, mFragment); 
       ft.addToBackStack(null); 
       ft.commit(); 
      } 
     }); 
     return mLayout; 
    } 
} 

Mon XML

mainfragment.xml

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/Maincontainer" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<fragment 
    android:name="com.fragment.main_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/main_fragment"> 
</fragment> 
</LinearLayout> 

En ce Fragment est appelé se sans doute, mais je chevauchant le fragment précédent.

Répondre

7

Vous avez une structure comme ceci:

TabActivity 
-> Tab1 = FragmentActivity = MainFragment 
-> Tab2   
-> Tab3   

De l'intérieur de MainFragment vous essayez de remplacer le contenu de son conteneur (lui-même).

Il serait préférable que le MainFragment appelle un TabActivity personnalisé qui à son tour a appelé un remplacement sur son conteneur, soit comme si (ce qui peut tomber sous le même problème car il exécute le même code au même endroit, mais il devrait vous donner une idée de base de ce que je veux dire):

Fragment newFragment = new FragmentToChangeTo(); 
    CustomTabActivity tabActivity = (CustomTabActivity) getActivity(); 
    tabActivity.changeFragment(newFragment); 

Si cela ne passe fonctionne pas essayer de faire une chose similaire, mais au lieu d'appeler directement l'activité des commandes à travers intentions & Actions (ou Bundles) contenant des informations sur quoi changer pour quel conteneur. J'aurais préféré dire/pourquoi/Fragments ne fonctionnent pas bien avec Fragment-in-fragment et intricacies connexes: vérifier here pour voir pourquoi je suggère de couper les fragments hors du contrôle des fragments.

+0

@Greame Je veux juste remplacer un fragment, pas fragmenter à l'intérieur Fragment. –

+0

Votre mauvaise compréhension. Vous utilisez un fragment pour se remplacer. Au mieux, c'est une pratique déroutante et mauvaise au pire, cela ne fonctionnera jamais (malheureusement, les fragments ne sont pas le processus le plus translucide). Créez un système dans lequel un fragment communique avec son conteneur pour qu'il remplace son enfant par autre chose. – Graeme

+0

Oui, maintenant j'ai compris que Fragments ne peut pas se remplacer, Merci. :) –

5

OK, plusieurs choses:

  1. Vous n'avez pas besoin à la fois remplacer et enlever. Remplacer efficacement supprime simplement le premier fragment et ajoute le second à sa place. Je soupçonne que vos arguments sont incorrects pour la commande de remplacement. Ceci est la forme appropriée:

    replace (int containerViewId, Fragment fragment) 
    

    Vous semblez être passer l'identifiant du fragment lui-même, plutôt que l'identifiant du conteneur. La commande replace prend l'identifiant de la vue conteneur et supprime tous les fragments dans ce conteneur avant d'en ajouter un nouveau. Donc, si cela était votre mise en page:

    <LinearLayout 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    
        <fragment class="com.example.stackoverflow.YourFragmentName" 
        android:id="@+id/main_fragment" 
        android:layout_weight="1" 
        android:layout_width="0px" 
        android:layout_height="match_parent" /> 
    
    </LinearLayout> 
    

    Vous utiliseriez:

    replace(R.id.container, mFragment); 
    

    et non

    replace(R.id.main_fragment, mFragment); 
    
  2. Puisque vous essayez de findFragmentById(R.id.main_fragment), je soupçonne que vous avez ajouté ce fragment à votre fichier de mise en page XML. Si vous avez ajouté un fragment directement dans le fichier XML, vous ne pouvez pas le supprimer par programmation lors de l'exécution. Pour supprimer ou remplacer des fragments, vous devez les avoir ajoutés avec un FragmentTransaction lors de l'exécution.

EDIT:

numéros 2 et 3 de ma réponse initiale sont encore valables.Vous devez utiliser l'ID du ViewGroup contenant pour ajouter et remplacer. Dans ce cas, c'est votre LinearLayout, R.id.Maincontainer, pas R.id.main_fragment. En outre, comme je l'ai déjà dit, vous ne pouvez pas supprimer les fragments que vous avez ajoutés directement dans le fichier XML. Votre main_fragment est ajouté au fichier XML et ne peut donc pas être supprimé lors de l'exécution.

Essayez ceci pour votre mainfragment.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/Maincontainer" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

    <Button 
    android:id="@+id/btn" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Switch Fragments"> 

</LinearLayout> 

Et ceci pour votre classe main_fragment:

public class main_activity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mainfragment); 

     //Notice that I am adding this 1st fragment in the Activity and not the XML 
     main_fragment mainFragment = new main_fragment(); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.add(R.id.Maincontainer, mainFragment); 
     ft.commit(); 

     mButton = (Button) findViewById(R.id.btn); 
     mButton.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View v) 
      { 

       Fragment mFragment = new third_fragment_view(); 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
       //Replacing using the id of the container and not the fragment itself 
       ft.replace(R.id.Maincontainer, mFragment); 
       ft.addToBackStack(null); 
       ft.commit(); 
      } 
     }); 
    } 
} 
0

@theisenp Je crée une vue tabulaire en ce sens que lorsqu'un bouton est cliqué, il faut passer à un autre écran lorsque j'essaie de l'implémenter en utilisant le code ci-dessus, il change à un autre écran mais le bouton est toujours visible et je veux l'écran suivant devrait couvrir tout l'écran

public class Tab1Fragment extends Fragment { 
LinearLayout mLayout; 
/** (non-Javadoc) 
* @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) 
*/ 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    if (container == null) { 


     return null; 
    } 

    LinearLayout theLayout = (LinearLayout)inflater.inflate(R.layout.tab_frag1_layout, container, false); 

      // Register for the Button.OnClick event 

      Button b = (Button)theLayout.findViewById(R.id.button1); 

      b.setOnClickListener(new View.OnClickListener() { 



       @Override 

       public void onClick(View v) { 

        Fragment mFragment = new third_fragment_view(); 
        android.support.v4.app.FragmentTransaction ft = getFragmentManager().beginTransaction(); 

        ft.replace(R.id.container, mFragment); 
        ft.addToBackStack(null); 
        ft.commit(); 


       } 

      }); 

    return theLayout; 

} 
} 

activity is displaying partially

Questions connexes