In Android possiamo permettere a un frammento di conoscere altri frammenti?

0

Penso di aver trovato indicazioni di progettazione contraddittorie all'interno della documentazione sulla frammentazione di Google Android .

La prima affermazione di seguito suggerisce che ciascun frammento non è a conoscenza di altri frammenti e comunica sempre solo l'attività e lascia che l'attività decida cosa deve essere fatto.

Creating event callbacks to the activity

In some cases, you might need a fragment to share events with the activity. A good way to do that is to define a callback interface inside the fragment and require that the host activity implement it. When the activity receives a callback through the interface, it can share the information with other fragments in the layout as necessary.

For example, if a news application has two fragments in an activity—one to show a list of articles (fragment A) and another to display an article (fragment B)—then fragment A must tell the activity when a list item is selected so that it can tell fragment B to display the article. In this case, the OnArticleSelectedListener interface is declared inside fragment A:

Ma una seconda affermazione più avanti nella stessa pagina, un frammento di lista istanzia direttamente un frammento di dettaglio.

   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();
            if (index == 0) {
                ft.replace(R.id.details, details);
            } else {
                ft.replace(R.id.a_item, details);
            }
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.commit();

Quindi le mie domande:

Questi sono in contraddizione tra loro?
Questo dovrebbe essere lasciato ad Activity?

Mi sento confuso, quindi ogni chiarimento è apprezzato.

    
posta Saran 10.03.2014 - 14:04
fonte

1 risposta

1

Ancora, suppongo.

Il punto del primo paragrafo citato dovrebbe essere che dovrebbero essere connessi tramite attività , dovrebbero essere collegati tramite genitore , che può essere un'attività o un frammento composito. Questo viene fatto per consentire una riprogettazione più facile dove uno dei frammenti deve essere sostituito e in generale per mantenere una corretta separazione dei problemi.

Ora nell'esempio forniscono alcune funzionalità per connettere direttamente i frammenti. Che in effetti non sembra seguire il consiglio di cui sopra. Avrebbe più senso fornire un'interfaccia attraverso la quale il widget elenco esponesse i dettagli dell'elemento selezionato e un'implementazione di tale interfaccia usando l'altro frammento. Quindi sarebbe ancora semplice collegare i due frammenti tramite quell'interfaccia dall'attività, ma allo stesso tempo fornirebbe un metodo coerente per l'utilizzo di una vista dei dettagli diversa.

    
risposta data 10.03.2014 - 15:43
fonte

Leggi altre domande sui tag