Layout del coordinatore con barra degli strumenti in frammenti o attività


94

Con la nuova libreria di design ci sono diversi nuovi layout che cambiano molto il modo in cui la barra degli strumenti può comportarsi se lo sviluppatore lo desidera. Poiché frammenti diversi hanno comportamenti e obiettivi diversi, ad esempio un frammento di galleria con una barra degli strumenti compressa che mostra una foto importante o un frammento senza una visualizzazione a scorrimento che semplicemente non necessita dell'appbarlayout per nascondere la barra degli strumenti, avere un'unica barra degli strumenti nell'attività può risulta difficile.

Quindi con questo, dovrei spostare la barra degli strumenti su ogni frammento? In tal caso, devo impostare supportActionBar ogni volta che mostro un frammento e ho anche un riferimento dell'attività nel frammento che annulla la natura indipendente dei frammenti. Se lascio la barra degli strumenti nell'attività da sola, devo avere più layout definiti per ogni tipo di comportamento in ogni frammento. Quale sarebbe l'approccio migliore?


1
Ciao, hai trovato una soluzione?
SERG

2
per il mio progetto attuale ho deciso di restare con la barra degli strumenti nell'attività e fare le animazioni appropriate quando richiesto. Ma è un po 'contorto. Ho provato a utilizzare la barra degli strumenti in ogni frammento e funziona bene, ma animare la barra degli strumenti tra le transizioni dei frammenti è più difficile e non so nemmeno se sia possibile perché non ho molta esperienza con le animazioni delle transizioni dei frammenti.
mobilepotato7

eventuali aggiornamenti o soluzioni migliori a questo ora?
Sagar Nayak

Risposte:


56

Per quanto mi riguarda, sembra troppo strano avere appbar e barra degli strumenti in ogni frammento. Quindi ho scelto di avere un'unica barra delle applicazioni con la barra degli strumenti in attività.

Per risolvere questo problema con CoordinatorLayout dovrai impostare un comportamento diverso del tuo FrameLayout(o di qualsiasi altro Layout) che dovrebbe contenere frammenti di ogni frammento che desideri sovrascrivere al comportamento predefinito.

Supponiamo che il tuo comportamento predefinito sia app:layout_behavior="@string/appbar_scrolling_view_behavior"

Quindi nel tuo fragment_activity_layout.xml potresti avere qualcosa del genere:

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/dashboard_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.Toolbar"
            app:layout_scrollFlags="scroll|enterAlways"/>
    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/dashboard_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>

E in ogni frammento che desideri non implementare app:layout_behavior="@string/appbar_scrolling_view_behavior"dovrai sovrascrivere onAttache onDetachmetodi che cambieranno il comportamento del tuo FrameLayout:

CoordinatorLayout.Behavior behavior;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if(behavior != null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    behavior = params.getBehavior();
    params.setBehavior(null);

}

@Override
public void onDetach() {
    super.onDetach();
    if(behavior == null)
        return;

    FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();

    params.setBehavior(behavior);

    layout.setLayoutParams(params);

    behavior = null;
}

Dopodiché, CoordinatorLayout non comprimerà la barra delle applicazioni, ecc. E consentirà ai layout dei frammenti di essere a tutta altezza.


Bello, dovrò provare questo e vedere se semplifica le cose. Grazie.
mobilepotato7

Se troverai qualcosa di più semplice, fammelo sapere. Penso che sia possibile cambiare il comportamento del coordinatore in qualsiasi momento durante il ciclo di vita dei frammenti (es. Normalmente hai un riciclatore con alcune cose ma in rari casi potrebbe essere vuoto e saprai che solo dopo il caricamento onLoadFinished, è possibile che tu mi piace mostrare un'immagine centrata notificando che non c'è niente qui, proprio come nell'app Inbox), ma non l'ho ancora provato. Forse più tardi oggi.
Клаус Шварц

Ok, funziona abbastanza bene. Ho creato un helper che si occupa di abilitare / disabilitare il coordinatore quando appropriato, quindi chiamo enableCoordinator(Activity activity)/ disableCoordinator(Activity activity)da frammenti.
Клаус Шварц

Dov'è il tuo aiuto, @ КлаусШварц? Quando lo chiami?
santhyago

1
@santhyago In the Fragment
Клаус Шварц

8

Ecco la mia soluzione

<!-- Put your fragment inside a Framelayout and set the behavior for this FrameLayout -->
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <!-- Your fragment -->
    <include layout="@layout/content_main" />

</FrameLayout>

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>


1

Questa è davvero una buona domanda: le Toolbars che devono agire come una ActionBardevono essere tenute in una Activityo in una Fragment? Dopo aver cercato in diverse domande e documentazione, non sono riuscito a trovare una soluzione che copra tutti i casi. Dipende quindi davvero dalla tua situazione che strada prendere.

Caso 1: la barra degli strumenti deve essere la sostituzione di ActionBar

Se la Toolbar deve comportarsi come una normale ActionBar (o se di tanto in tanto viene mostrato al massimo 1 frammento), penso che il modo migliore / più semplice sia usare la Activitiesbarra degli strumenti tradizionale con la propria e inserire il tuo frammento. In questo modo non devi preoccuparti di quando deve essere visualizzata la barra degli strumenti.

È anche possibile modificare ActionBar (-behaviour) da Fragments, ma non lo consiglierei, poiché ciò ti obbliga a tenere traccia di quale Fragment ha modificato la ActionBar e quando. Non so nemmeno se l'impostazione di ActionBar può essere eseguita più volte.

Caso 2: ogni frammento dovrebbe avere la propria (parte di) barra degli strumenti

Puoi anche scegliere di inserire diverse barre degli strumenti autonome in diversi frammenti, con le proprie azioni. In questo modo potresti visualizzare diversi frammenti uno accanto all'altro - ciascuno con le proprie azioni nella barra degli strumenti - e suggerire che si tratti di 1 barra degli strumenti (forse come l'app Gmail, anche se non sono sicuro). Ciò tuttavia significa che dovresti gonfiare quelle barre degli strumenti da solo, ma non deve essere molto difficile.

Spero che questo aiuti a fare una scelta.

(Scusa se ho fatto degli errori (linguistici))


4
scusate ma questo non risponde ai problemi relativi alla nuova libreria di design. Certo, avere la barra degli strumenti come barra delle azioni è l'obiettivo, ma avere più layout di coordinatore per diversi tipi di barre degli strumenti può essere complicato. Quello che ho scoperto è che è possibile animare la barra degli strumenti secondo necessità. Devo ancora testarlo meglio ma sembra che ci siano buoni risultati
mobilepotato7
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.