Android: ho bisogno di alcuni chiarimenti sui frammenti rispetto alle attività e alle visualizzazioni


Answers

  1. Il frammento fa parte di un'attività, che contribuisce alla sua interfaccia utente a quell'attività. Il frammento può essere pensato come una subattività. Dove come lo schermo completo con cui l'utente interagisce è chiamato come attività. Un'attività può contenere più frammenti. Gli oggetti sono principalmente una parte secondaria di un'attività.

  2. Un'attività può contenere 0 o più numero di frammenti in base alle dimensioni dello schermo. Un frammento può essere riutilizzato in più attività, quindi si comporta come un componente riutilizzabile nelle attività.

  3. Un frammento non può esistere indipendentemente. Dovrebbe essere sempre parte di un'attività. Dove come attività può esistere senza alcun frammento in esso.

Question

Nell'API Android 11+, Google ha rilasciato una nuova classe chiamata Fragment .

Nei video, Google suggerisce che, laddove possibile ( link1 , link2 ), dovremmo utilizzare i frammenti anziché le attività, ma non hanno spiegato esattamente perché.

Qual è lo scopo dei frammenti e alcuni possibili usi di essi (diversi da alcuni esempi di interfaccia utente che possono essere facilmente ottenuti con viste / layout semplici)?

La mia domanda riguarda i frammenti:

  1. Quali sono gli scopi dell'utilizzo di un frammento?
  2. Quali sono i vantaggi e gli svantaggi dell'utilizzo dei frammenti rispetto all'utilizzo di attività / viste / layout?

Domande bonus:

  1. Puoi dare alcuni usi davvero interessanti per i frammenti? Cose che Google non ha menzionato nei loro video?
  2. Qual è il modo migliore per comunicare tra i frammenti e le attività che li contengono?
  3. Quali sono le cose più importanti da ricordare quando usi i frammenti? Eventuali suggerimenti e avvertenze sulla tua esperienza?



Un frammento rappresenta un comportamento o una parte dell'interfaccia utente in un'attività. È possibile combinare più frammenti in un'unica attività per creare un'interfaccia utente a più riquadri e riutilizzare un frammento in più attività. È possibile pensare a un frammento come a una sezione modulare di un'attività, che ha il proprio ciclo di vita, riceve i propri eventi di input e che è possibile aggiungere o rimuovere mentre l'attività è in esecuzione.

  • puoi manipolare ciascun frammento in modo indipendente, come aggiungerlo o rimuoverlo. Quando si esegue una transazione di questo tipo, è possibile aggiungerla anche a uno stack posteriore gestito dall'attività: ogni voce dello stack secondario dell'attività è un record della transazione del frammento che si è verificata. Lo stack posteriore consente all'utente di invertire una transazione frammento (navigare all'indietro), premendo il pulsante Indietro.

  • Quando si aggiunge un frammento come parte del proprio layout di attività, esso vive in un ViewGroup all'interno della gerarchia di visualizzazione dell'attività e il frammento definisce il proprio layout di visualizzazione. È possibile inserire un frammento nel layout dell'attività dichiarando il frammento nel file di layout dell'attività, come elemento o dal codice dell'applicazione aggiungendolo a un ViewGroup esistente. Tuttavia, non è richiesto che un frammento faccia parte del layout dell'attività; puoi anche usare un frammento senza la sua interfaccia utente come lavoratore invisibile per l'attività.

  • Ad esempio: se dovessi utilizzare NavigationDrawer senza Fragments, sarebbe meglio mantenere l'istanza di NavigationDrawer in una singola attività e quando navighi nell'app scegliendo tra gli elementi in NavigationDrawer, ognuna delle attività avviate non dovrebbe implementare NavigationDrawer, ma invece dovrebbe implementare il pulsante Indietro per tornare alla "principale" / singola attività in cui è stato implementato NavigationDrawer.

    Nota: se si desidera implementare NavigationDrawer in più attività, è necessario ricreare una nuova istanza di NavigationDrawer in ogni attività che si desidera visualizzarla.

    Suppongo che questo sarebbe uno svantaggio rispetto all'utilizzo di Frammenti, mentre se hai usato un frammento non avresti bisogno di molte istanze del cassetto ne avresti bisogno solo uno.

    Cassetto con frammenti anziché attività

    Se si utilizza NavigationDrawer con Fragments, il cassetto deve essere implementato in una singola attività e quando viene selezionato ciascun elemento del cassetto, il loro contenuto viene visualizzato in ciascuno dei propri frammenti.

  • Comunicare tra frammento alla sua attività : Per consentire a un frammento di comunicare fino alla sua attività, è possibile definire un'interfaccia nella classe Fragment e implementarla all'interno dell'attività. Il frammento acquisisce l'implementazione dell'interfaccia durante il suo ciclo di vita onAttach () e può quindi chiamare i metodi di interfaccia per comunicare con l'attività.

    public class YourFragment extends ListFragment {
    OnSelectedListener mCallback;
    
    // Container Activity must implement this interface
    public interface OnSelectedListener {
        public void onItemSelected(int position);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.your_view, container, false);
    }
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    
        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnSelectedListener");
        }
    }
    
    }...
    

Ora il frammento può recapitare messaggi all'attività chiamando il metodo onItemSelected () (o altri metodi nell'interfaccia) utilizzando l'istanza mCallback dell'interfaccia OnSelectedListener.

public static class MainActivity extends Activity
        implements YourFragment.OnSelectedListener{
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
    }

    public void onItemSelected(int position) {
        // The user selected the headline of an article from the YourFragment
        // Do something here to display that article

        YourFragment yourFrag = (YourFragment)
                getSupportFragmentManager().findFragmentById(R.id.your_fragment);

        if (yourFrag != null) {
            // If your frag is available, we're in two-pane layout...

            // Call a method in the YourFragment to update its content
            yourFrag.updateView(position);
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...

            // Create fragment and give it an argument for the selected item
            YourFragment newFragment = new YourFragment();
            Bundle args = new Bundle();
            args.putInt(YourFragment.ARG_POSITION, position);
            newFragment.setArguments(args);

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();
        }
    }
}



Un frammento vive all'interno di un'attività.

Mentre un'attività vive su se stessa.




I frammenti sono particolarmente utili in alcuni casi, ad esempio dove vogliamo conservare un cassetto di navigazione in tutte le nostre pagine. È possibile gonfiare il layout di una cornice con qualsiasi frammento desiderato e continuare ad accedere al cassetto di navigazione.

Se avessi usato un'attività, avresti dovuto tenere il cassetto in tutte le attività che rendono il codice ridondante. Questo è un uso interessante di un frammento.

Sono nuovo di Android e continuo a pensare che un frammento sia utile in questo modo.




Un frammento è una parte dell'interfaccia utente o del comportamento di un'applicazione che può essere inserita in un'attività che consente una progettazione di attività più modulare. Non sarà sbagliato se diciamo che un frammento è una specie di subattività.

Di seguito sono riportati i punti importanti su un frammento:

  1. Un frammento ha il proprio layout e il proprio comportamento con i propri callback del ciclo di vita.

  2. È possibile aggiungere o rimuovere frammenti in un'attività mentre l'attività è in esecuzione.

  3. È possibile combinare più frammenti in un'unica attività per creare un'interfaccia utente a più riquadri.

  4. Un frammento può essere utilizzato in più attività.

  5. Il ciclo di vita del frammento è strettamente correlato al ciclo di vita della sua attività ospite.

  6. Quando l'attività viene messa in pausa, anche tutti i frammenti disponibili nell'account verranno fermati.

  7. Un frammento può implementare un comportamento senza componente dell'interfaccia utente.

  8. I frammenti sono stati aggiunti all'API Android in Android 3 (Honeycomb) con l'API versione 11.

Per maggiori dettagli, visita il sito ufficiale, Fragments .