Fragment Android, revenir sans recréer / recharger Fragment
J'ai vu pas mal de questions sur DONC sur les Fragments et encore je n'arrive pas à comprendre si ce que je veux faire est possible, et plus encore si mon modèle de conception est juste imparfait et j'ai besoin de re-travailler l'ensemble du processus. En gros, comme la plupart des questions qui ont été posées, j'ai une ActionBar avec NavigationTabs (à l'aide de ActionBarSherlock), puis à l'intérieur de chaque Onglet, il y a un FragementActivity et puis le FragmentActivities pousser de nouveaux Fragments, lorsqu'une ligne est sélectionnée (je suis en train de re-créer un Projet iOS à Android et c'est seulement une base de Navigation en fonction de l'application avec quelques onglets qui peuvent consulter des informations spécifiques). Quand je clique sur le bouton retour du téléphone le Fragment précédent est chargé, mais le Fragment re-crée lui-même (ainsi, les WebServices sont de nouveau appelée pour chaque vue) et ce n'est pas nécessaire étant donné que les informations ne changera pas dans la vue précédente lorsque vous allez vers l'arrière. Donc, fondamentalement, ce que je veux savoir comment puis-je configurer mon Fragments de sorte que lorsque j'appuie sur le bouton de retour sur le téléphone, le Fragment précédent est juste tiré vers le haut avec la précédente éléments déjà créés. Ci-dessous mon code actuel :
//This is from my FragmentActivity Class that contains the ActionBar and Tab Selection Control
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
//TODO Auto-generated method stub
int selectedTab = tab.getPosition();
if (selectedTab == 0) {
SalesMainScreen salesScreen = new SalesMainScreen();
ft.replace(R.id.content, salesScreen);
}
else if (selectedTab == 1) {
ClientMainScreen clientScreen = new ClientMainScreen();
ft.replace(R.id.content, clientScreen);
}.....
//This is within the ClientMainScreen Fragment Class, which handles moving to the Detail Fragment
row.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Do something if Row is clicked
try{
String selectedClientName = clientObject.getString("ClientName");
String selectedClientID = clientObject.getString("ClientID");
String selectedValue = clientObject.getString("ClientValue");
transaction = getFragmentManager().beginTransaction();
ClientDetailScreen detailScreen = new ClientDetailScreen();
detailScreen.clientID = selectedClientID;
detailScreen.clientName = selectedClientName;
detailScreen.clientValue = selectedValue;
int currentID = ((ViewGroup)getView().getParent()).getId();
transaction.replace(currentID,detailScreen);
transaction.addToBackStack(null);
transaction.commit();
}
catch (Exception e) {
e.printStackTrace();
}
}
});....
//And then this is the Client Detail Fragment, with the method being called to Call the Web Service and create thew (since what is displayed on this screen is dependent on what is found in the Web Service
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) {
return inflater.inflate(R.layout.clientdetailscreen, group, false);
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//Setup Preferences File Link
this.preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
//initialize the table object
mainTable = (TableLayout)getActivity().findViewById(R.id.mainTable);
//setup the detail table
setupRelatedClientSection();
}
Le Client de Détail de l'Écran peut puis de descendre une fois de plus, en utilisant la même méthode que le Client Principal de l'Écran, mais quand je reviens à partir de ce nouvel écran pour l'Écran de Détail de la seuptRelatedClientSection() la méthode est appelée à nouveau et ainsi de l'ensemble du Fragment est reconstruit quand vraiment j'ai juste envie de se tirer une version enregistrée de l'écran. Est-ce possible avec ma configuration actuelle, ou ai-je cette approche dans le mauvais sens?
source d'informationauteur Sal Aldana
Vous devez vous connecter pour publier un commentaire.
Je crois que vous êtes à la recherche pour
show()
ethide()
.Je pense que vous pouvez toujours les ajouter à la backstack.
Je n'ai pas eu mon code à regarder, mais je crois que c'est la façon dont il serait aller... l'Essayer, à moins que quelqu'un d'autre a une meilleure façon.
Je n'ai pas essayé la backstack avec show() hide() mais je crois qu'il faut les modifications qui sont faites avant les transactions sont validées et les annuler si l'arrière est enfoncé. S'il vous plaît revenir à moi à cause de cela, je suis intéressé de savoir.
Vous aussi vous devez vous assurer que le niveau de détail fragment est créé avant l'appel de cette. Puisqu'il est basé sur le clic de someitem alors vous devriez probablement créer les détails fragment chaque fois que vous cliquez sur s'assurer que les détails fragment est créé.
Essayez d'utiliser fragementTransaction.ajouter au lieu de remplacer
Je poste cette réponse pour les personnes qui peuvent porter cette question à l'avenir.
Code suivant va montrer comment l'ouvrir FragmentB de FragmentA et de revenir à la FragmentA de FragmentB (sans actualisation de FragmentA) en appuyant sur la touche retour.
Dans votre MainActivity remplacer onBackPressed()
Vous avez raison, il y a eu un certain nombre de questions précédentes et de la documentation sur le sujet 😉
La documentation sur des Fragments, en particulier la section sur les Transactions et Économiser de l'Etat, va vous guider vers la réponse.
http://developer.android.com/guide/components/fragments.html#Transactions
http://developer.android.com/guide/components/activities.html#SavingActivityState
Android - Fragment onActivityResult éviter de recharger
Fragments peuvent bénéficier d'un appui pour
onSaveInstanceState
mais pasonRestoreInstanceState
donc si vous voulez enregistrer une référence à la table de vues, de les enregistrer sur leBundle
et vous pouvez accéder à la vue enregistrée dans votreonActivityCreated
méthode. Vous pouvez également utiliser les Fragments de la pile de retour.Ce guide/tutoriel a des instructions très détaillées et des exemples sur la pile de retour et de conserver fragment de l'état.
Bonne chance