2012-03-24 17 views
19

Sto cercando di imparare Frammenti in Android e da vari esempi ho trovato che ci sono diversi modi per farlo e volevo solo avere qualche consiglio su quale sia il modo corretto, o almeno in quali circostanze, a senso unico dovrebbe essere usato su un altroFrammenti Android devo riutilizzare 1 frammento o creare nuove istanze?

Un esempio ha creato un layout che conteneva un frammento e un FrameLayout. Nel codice, quando un elemento viene selezionato da ListFragment viene creato un nuovo frammento (con alcuni dati richiesti nel costruttore) e FrameLayout viene sostituito con questo nuovo frammento (utilizzando FragmentTransaction.replace()).

Un altro esempio ha un file di layout che dichiara i 2 frammenti affiancati. Ora nel codice quando l'utente seleziona un elemento dall'elenco in un frammento viene effettuata una chiamata all'altro frammento per aggiornare i dati (in base all'elemento selezionato).

Quindi mi chiedo se uno di questi metodi è preferito rispetto all'altro o se ci sono determinate circostanze in cui uno dovrebbe essere utilizzato?

EDIT: ecco il codice per ciascuno dei due metodi mi riferivo a:

1:

 mCurCheckPosition = index; 

     if (mDualPane) { 
      // We can display everything in-place with fragments, so update 
      // the list to highlight the selected item and show the data. 
      getListView().setItemChecked(index, true); 

      // Check what fragment is currently shown, replace if needed. 
      DetailsFragment details = (DetailsFragment) 
        getFragmentManager().findFragmentById(R.id.details); 
      if (details == null || details.getShownIndex() != index) { 
       // Make new fragment to show this selection. 
       details = DetailsFragment.newInstance(index); 

       // Execute a transaction, replacing any existing fragment 
       // with this one inside the frame. 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
       ft.replace(R.id.details, details); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
       ft.commit(); 
      } 

     } else { 
      // Otherwise we need to launch a new activity to display 
      // the dialog fragment with selected text. 
      Intent intent = new Intent(); 
      intent.setClass(getActivity(), DetailsActivity.class); 
      intent.putExtra("index", index); 
      startActivity(intent); 
     } 

2:

public void onListItemClick(ListView l, View v, int position, long id) { 
    String item = (String) getListAdapter().getItem(position); 
    DetailFragment fragment = (DetailFragment) getFragmentManager() 
      .findFragmentById(R.id.detailFragment); 
    if (fragment != null && fragment.isInLayout()) { 
     fragment.setText(item); 
    } else { 
     Intent intent = new Intent(getActivity().getApplicationContext(), 
       DetailActivity.class); 
     intent.putExtra("value", item); 
     startActivity(intent); 

    } 

} 

risposta

20

Quindi mi chiedo solo se uno di questi metodi è preferito rispetto all'altro o se ci sono determinate circostanze in cui uno dovrebbe essere usato?

Se il frammento reale non ha bisogno di cambiare (cioè, è la stessa classe frammento), avrei l'attività chiamare un metodo su quel frammento piuttosto che sostituirlo (lo scenario # 2), supponendo che esiste. Questo è molto meno costoso in fase di esecuzione ed è probabilmente più semplice da codificare.

Se, tuttavia, il frammento potrebbe dover essere diverso (ad esempio, a seconda di ciò che si fa clic, potrebbero esserci diversi frammenti per diversi tipi di oggetti del modello rappresentati nell'elenco), quindi sarà necessario sostituire il frammento (il tuo scenario n. 1). Potresti ottimizzare il caso in cui il frammento si verifica perché questo evento sia della stessa classe, anche se mi concentrerei prima su come farlo funzionare semplicemente sostituendo il frammento e preoccupandomi dell'ottimizzazione se/quando hai il tempo e l'inclinazione .

Non sono un fan del tuo codice # 2, tuttavia. IMHO, i frammenti non dovrebbero parlare direttamente con altri frammenti. Il mio schema preferito è che i frammenti "aderiscano al loro lavoro a maglia", concentrandosi esclusivamente sulle cose all'interno dei propri widget e modelli. Per eventi che riguardano altre parti dell'interfaccia utente (ad esempio, fare clic su elenco), chiedere al frammento di notificare l'attività (ad es. Tramite un'interfaccia listener). L'attività è quella che sa quali frammenti dovrebbero essere in giro, poiché è quello che li ha creati in primo luogo. L'attività può quindi parlare all'altro frammento (se esiste), creare l'altro frammento (se c'è spazio) o avviare un'altra attività. Se preferisci il tuo approccio # 2, sei libero di usarlo - non è proprio quello che farei nella tua circostanza.

Problemi correlati