23

Attualmente sto avendo un problema con un FrameLayout in una CoordinatorLayout dalla libreria di design-supporto Android, mentre ho seguito le istruzioni di questa post durante la creazione delle schede.Android SupportLib - FrameLayout in CoordinatorLayout con AppBarLayout consumare tutto lo schermo ad altezza

Fondamentalmente molte cose funzionare come previsto, il contenitore-frammenti vengono gonfiati in FrameLayout e loro tab-frammenti sono correclty aggiunti ViewPager come schede (necessario in questo modo perché ho avuto numerosi frammenti che dovrebbe riutilizzare il layout) .

Il problema che sto lottando con è che il FrameLayout (e di conseguenza anche i tab-frammenti) consuma l'intero schermo-altezza in modo che si sovrappone alla Toolbar e TabLayout. Per visualizzare il problema ho creato la seguente immagine:

Visualized issue

Base-Disposizione con CoordinatorLayout, Toolbar e TabLayout:

<android.support.design.widget.CoordinatorLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appBarLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <include layout="@layout/toolbar" /> 

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

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

    <FrameLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

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

formato distinto utilizzato dai frammenti gonfiati in container:

<android.support.v4.view.ViewPager 
    android:id="@+id/viewPager" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

Tutti i frammenti sono gonfiati dal mio BaseFragment di classe (su un altro post su SO chiamando inflater.inflate(getLayoutRes(), null); era il problema che causa lo stesso problema)

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(getLayoutRes(), container, false); 
} 

Se si sostituisce la CoordinatorLayout con un normale LinearLayout le FrameLayout inizia sotto il AppBarLayout come previsto, ma come per il documentation il AppBarLayout per la maggior parte delle sue caratteristiche richiede di essere un figlio diretto del CoordinatorLayout.

Potrei semplicemente aggiungere un marginTop allo FrameLayout ma vorrei sapere se esiste una soluzione appropriata per questo. Grazie in anticipo per eventuali suggerimenti!

risposta

34

Sposta il tuo app:layout_behavior="@string/appbar_scrolling_view_behavior" su FrameLayout - questo attributo deve essere sul figlio diretto dello CoordinatorLayout.

+0

Questo ha risolto lo stesso problema che avevo, grazie, ma non ho idea del perché. Cosa fa appbar_scrolling_view_behavior' esattamente ...? – Micro

+1

@MicroR - Suggerisco di leggere il Javadoc di [AppBarLayout.ScrollingViewBehavior [(http://developer.android.com/reference/android/support/design/widget/AppBarLayout.ScrollingViewBehavior.html) o guardando [la fonte codice] (https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/AppBarLayout.java#1128) - aggiunge il richiesto padding per non sovrapporsi a 'AppBarLayout' e consentire a' AppBarLayout' di rispondere allo scrolling se messo su una vista scorrevole (come 'NestedScrollView' o' RecyclerView') – ianhanniballake

+0

@ianhanniballake ho usato il tuo suggerimento ma il problema è im ottenere qualche spazio in più tra il mio tablayout e framelayout ho applicato bk color per analizzare il motivo ma nessun colore di sfondo appare nell'interfaccia utente – Erum