FragmentTransaction de ne rien faire
Je suis à l'apprentissage de fragments et donnée ci-dessous est mon premier fragment de programme. Un projet simple, où j'ai 2 écrans. Lorsque je clique sur le bouton suivant de premier écran, le deuxième bouton doit être affichée.
Je suis ciblant Android 2.1 et au-dessus et à l'aide de la compatibilité paquet
AppMainFragmentActivity.java
public class AppMainFragmentActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.app_main_layout);
}
}
app_main_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:id="@+id/fragment_container">
<fragment class="com.research.fragmentstudy.FirstFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/id_first_fragment"/>
</LinearLayout>
FirstFragment.java
public class FirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.first_fragment_layout
, container,false);
Button nextButton =(Button) view.findViewById(R.id.button);
nextButton.setOnClickListener(nextListener);
return view;
}
private OnClickListener nextListener = new OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fm = ((AppMainFragmentActivity)FirstFragment.this
.getActivity()).getSupportFragmentManager();
SecondFragment fragment = new SecondFragment();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment_container, fragment);
ft.commit();
}
};
}
first_fragment_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:id="@+id/first_fragment_root">
<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Fragment 1" android:gravity="center_horizontal" />
<Button android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content" android:id="@+id/button"
android:text="Next" />
</LinearLayout>
SecondFragment.java
public class SecondFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.second_fragment_layout,
container,false);
return view;
}
}
second_fragment_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:id="@+id/first_fragment_root">
<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Fragment 2" android:gravity="center_horizontal" />
</LinearLayout>
Eh bien, je suis le premier écran bien. Maintenant,
Ce que j'attendais, à partir de ma compréhension de fragment
- Quand je clique sur le bouton Suivant dans l'écran 1, SecondFragment est créé,
sononCreate()
etonCreateView()
est appelée. - SecondFragment est montré, et FirstFragment est détruit (depuis que je suis
pas de l'ajouter à la backstack). Il n'y aura pas d'animation depuis
par défaut fragment opération n'a pas d'animation.
Ce qui se passe
- SecondFragment est se créé bien, son
onCreate()
etonCreateView()
est appelée. - Mais FirstFragment reste sur l'écran, et une seconde de ne jamais montrer.
Maintenant ma compréhension de fragment peut être erronée. Mais je crois que quand on commit() un fragment de la transaction, le premier fragment doit être remplacé par seconde (la première obtient caché ou détruit). Eh bien rien ne semble se passer. Pourquoi est-ce? Doit-on détruire manuellement/masquer le premier fragment?
Note : je sais que c'est une longue question pour une chose fondamentale. Mais j'ai mis tout mon code car je ne suis pas sûr de l'endroit où j'ai tout fait foiré.
OriginalL'auteur Krishnabhadra | 2012-09-14
Vous devez vous connecter pour publier un commentaire.
Bien je l'ai eu à travailler. Les deux réponses à cette question correctement raconte une raison pour que mon code ne fonctionne pas comme prévu. Mais il y a eu 2 erreurs dans mon code.
à l'aide de
fragmentTransaction.add()
ne montre pas de nouveau fragment plus ancien. vous devez appeler replace(). Les réponses données ont droit.Mais il y avait une erreur dans mon code. Vous ne pouvez pas remplacer un fragment créé de manière statique en xml. J'ai donc changé
app_main_layout.xml
et
AppMainFragmentActivity.java
C'est un piège! Pour il ya tellement de nombreuses fonctions appelées add()...mais seulement fragmentTransaction.ajouter(R. id.fragment_container,fragment); travail...perte de temps...
désolé, mais je n'ai pas compris votre commentaire..
Je veux dire avant que j'ai vu votre solution, il a fallu presque une heure pour vérifier ce qui est mal...vraiment une perte de temps. Dans mon cas, je suis en ajoutant fragment d'une activité vide sans setContentView(). Il a également afficher rien mais vide la zone noire. Vraiment je VOUS REMERCIE pour cette!
Remarque: Lors de l'ajout d', vous devez vérifier si le fragment a été créé avant.
OriginalL'auteur Krishnabhadra
Avez-vous essayé d'utiliser ft.remplacer(R. id.fragment_container, fragment) au lieu de l'ajouter ?
ajouter ne sera pas enlever le fragment existant.
Nous avons donc besoin de supprimer, créer un fragment tout comme nous d'ajouter et de supprimer une mise en page. Donc, qu'est-ce que l'utilisation de cette FragmentTransaction?
Depuis il n'y a pas de défaut d'empilement de fragment, lorsqu'un fragment se passe à l'écran, il est destoyed à droite, puis. Quand je vais fragment de A à B, et de revenir à Un j'ai besoin de créer Un à partir de zéro à droite?
Concernant votre première question, FragmentTransaction sont utilisés pour ajouter / supprimer / remplacer les fragments dans un modèle particulier lors de l'exécution. Il n'y a pas de défaut d'empilement, mais vous pouvez ajouter un fragment de la transaction à la pile de retour en appelant addToBackStack(string) & le popping la pile à l'aide de gestionnaire de Fragment
OriginalL'auteur Sujai Kamat
Vous essayez d'ajouter un fragment de fragment_container, Il est l'ajout d', mais votre fragment de coutume visible parce que vous avez largeur et la hauteur spécifiées pour id_first_fragment comme fill_parent donc, essayez de définir wrap_content pour id_first_fragment fragment . vous pouvez voir le fragment suivant lorsque vous cliquez sur le bouton . Si vous voulez fermer le premier fragment et de montrer second, vous devez le remplacer au lieu d'ajouter .
OriginalL'auteur Nagarajan