Ho una scheda principale TabActivity che ha due schede, A e B (per ora). Tab A carica un FragmentActivity (codice di seguito indicato) che contiene solo un FrameLayout
, quindi posso caricare i miei frammenti per quella specifica scheda al suo interno.FragmentManager.popBackStack() non carica semplicemente il frammento precedente
Il primo frammento ha alcune immagini di testo e uno ListView. I dati vengono estratti da un servizio Web. Quando faccio clic su un elemento di ListView, carico i dettagli di quell'elemento in un altro frammento (anch'esso proviene da un servizio Web) e sostituisco il frammento corrente (con ListView e altri controlli) con un altro frammento di dettaglio.
Per raggiungere questo obiettivo, sto usando la libreria android-support-v4.jar per utilizzare Frammenti come erano preferiti. XML di
scheda di un FragmentActivity:
<?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" >
<FrameLayout
android:id="@+id/updates_frame"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/background"/>
</LinearLayout>
Tab Un FragmentActivity codice Java:
public class UpdatesFragmentActivity extends FragmentActivity implements
IUpdateNotifier {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.updates);
//Load Initial Fragment into FrameLayout
//I am adding this Fragment to BackStack
Fragment newFragment = new UpdatesFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.addToBackStack(null);
ft.add(R.id.updates_frame, newFragment);
ft.commit();
}
//This is an Interface method which I call with the clicked "FEED" object to load its detail in another Fragment
@Override
public void onFeedSelected(Feed feed) {
// Instantiate a new fragment.
Fragment newFragment = new FeedDetailFragment(feed);
// Add the fragment to the activity, pushing this transaction
// on to the back stack.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.updates_frame, newFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
}
//This is another Interface Method which I call when the user presses "BACK".
//I am trying to load the previously loaded Fragment, which I added to BackStack.
//But this causes reconstruction of the previously loaded fragment. LIST in this case
//which call the web service. I DONT WANT TO CALL SERVICE AGAIN.
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
}
}
}
ho creato un'interfaccia IUpdateNotifier, che contiene due metodi:
public void onFeedSelected(Feed feed);
public void onBackPressed();
Parent UpdatesFragmentActivity implementa questi metodi. Io chiamo questi metodi dai bambini Frammenti dopo le azioni seguenti.
- mi chiamano onFeedSelected (Feed feed) dal frammento che ha una ListView. Invio l'elemento del feed selezionato al parent FragmentActivity, quindi carica un altro frammento che conterrebbe i dettagli del feed.
- Io chiamo onBackPressed() dal secondo dettaglio del feed Frammento quando l'utente preme un pulsante che dovrebbe riportare il primo frammento che conteneva ListView con altri controlli. Come potete vedere, provo a chiamare di FragmentManager popBackStack() metodo per riportare quel primo frammento ...
Ma il primo frammento ottiene rinfrescato e carica tutti i dati dal servizio web.
In realtà non riesco ad ottenere e memorizzare i dati solo una volta, né gli aggiornamenti sono frequenti su alcuni intervalli di tempo. L'utente può aggiornare l'elenco quando lo desidera. Inizialmente, l'elenco carica i 10 elementi principali dal servizio, quindi l'utente può fare clic sul pulsante "Altro" alla fine dell'elenco se desidera caricare più articoli.
Caricherà i prossimi 10 articoli e così via. Ma penso di poter archiviare l'ArrayList recuperato in qualche variabile in UpdatesFragmentActivity e quindi semplicemente riassegnare quell'ArrayList alla scheda dell'elenco invece di caricare i dati dal servizio, ma non so come rendere Fragment a non chiamare di nuovo il servizio.
Voglio che si comporti come quando clicco sulla scheda 2 e poi di nuovo sulla scheda 1. Mostra semplicemente i dati caricati come se fossero nascosti e non chiama il servizio.
Come posso ottenere questo risultato?
hai trovato una soluzione –