5

Ho un problema quando provo a inserire i frammenti con CoordinatorLayout + AppBarLayout.CoordinatorLayout + ActionBar + Fragments

Cerco di caricare diversi frammenti nel mio contenuto RelativeLayout che è al di sotto di ActionBar con l'attributo app:layout_behavior="@string/appbar_scrolling_view_behavior" ma quando carico un frammento con due pulsanti nella parte inferiore dello schermo questi vengono caricati fuori dallo schermo.

Il contenuto in cui sono caricati i frammenti è fuori dallo schermo e il contenuto esce sempre dal basso.

Questo il codice della mia main_activity.xml:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/coordinator" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".views.activities.HomeActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appBarLayout" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     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:popupTheme="@style/AppTheme.PopupOverlay" 
      app:layout_scrollFlags="scroll|enterAlways" /> <!-- Indica como afecta a los hijos de AppBar --> 

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

    <!-- Fragment are loaded here --> 
    <RelativeLayout 
     android:id="@+id/containerLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" > 
    </RelativeLayout> 

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

Questo è lo screenshot con il contenuto fuori dello schermo.

enter image description here

Questa è la schermata del frammento dove ho il problema: enter image description here

Questa è la schermata con il frammento caricata nell'emulatore. Puoi vedere come i pulsanti in basso non appaiono. Essi sono nascosti dalla barra di navigazione:

enter image description here

Come posso evitare questo problema?

EDIT

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/coordinator" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".views.activities.HomeActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appBarLayout" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     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:popupTheme="@style/AppTheme.PopupOverlay" 
      app:layout_scrollFlags="scroll|enterAlways" /> <!-- Indica como afecta a los hijos de AppBar --> 

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

    <!-- Main content --> 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

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

     </FrameLayout> 

    </RelativeLayout> 

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

EDIT 2: ho provato mettere ToolBar in RelativeLayout, ma funziona parzialmente. Ora non funziona l'animazione sopra ActionBar quando scorrimento in recyclerView

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/coordinator" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".views.activities.HomeActivity"> 

    <!-- Main content --> 
    <RelativeLayout 

     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" > 

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

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="?attr/colorPrimary" 
       app:popupTheme="@style/AppTheme.PopupOverlay" 
       app:layout_scrollFlags="scroll|enterAlways" /> <!-- Indica como afecta a los hijos de AppBar --> 

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

     <FrameLayout 
      android:id="@+id/containerLayout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_below="@+id/appBarLayout"> 

     </FrameLayout> 

    </RelativeLayout> 

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

Prova a mettere un 'FrameLayout' nel vostro' RelativeLayout', e gonfiare il 'Fragments' in esso. – yennsarah

+0

Proverò la tua soluzione e ti commento ora. Grazie :) –

+0

@La tua soluzione non funziona :( –

risposta

1

ho finalmente capito che ciò che accade con CoordinatorLayout è che la vista sotto la AppBarLayout è dimensionato in altezza come se la Toolbar era già scorrere fuori dal modo. Quindi, quando la barra degli strumenti è in posizione normale, la vista viene semplicemente spostata verso il basso. Non viene ridimensionato poiché lo CoordinatorLayout scorre tutto.

Ciò significa che tutte le viste collegate alla parte inferiore di tale vista verranno spostate e non visibili o parzialmente visibili.

Quindi come si fa a risolvere questo? Hai bisogno di fare due cose:

  1. portare il AppBarLayout e Toolbar nel vostro frammento. Il frammento può impostare il supporto ActionBar su Toolbar e fare tutto ciò che normalmente si farebbe nell'attività. Così ora il layout attività potrebbe essere semplice come questo:

    <FrameLayout 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:tools="http://schemas.android.com/tools" 
        android:id="@+id/containerLayout" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        tools:context=".views.activities.HomeActivity"/> 
    
  2. Fissare i pulsanti per la parte inferiore del CoordinatorLayout. CoordinatorLayout è una sottoclasse di FrameLayout in modo che sia possibile avere layout_gravity="bottom" in una vista secondaria.Così ora la tua XML frammento potrebbe essere simile a questo:

    <?xml version="1.0" encoding="utf-8"?> 
    <android.support.design.widget.CoordinatorLayout 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:app="http://schemas.android.com/apk/res-auto" 
        xmlns:tools="http://schemas.android.com/tools" 
        android:id="@+id/coordinator" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        tools:context=".views.activities.HomeActivity"> 
    
        <android.support.design.widget.AppBarLayout 
         android:id="@+id/appBarLayout" 
         android:layout_height="wrap_content" 
         android:layout_width="match_parent" 
         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:popupTheme="@style/AppTheme.PopupOverlay" 
          app:layout_scrollFlags="scroll|enterAlways" /> <!-- Indica como afecta a los hijos de AppBar --> 
    
        </android.support.design.widget.AppBarLayout> 
    
        <RelativeLayout 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" 
         app:layout_behavior="@string/appbar_scrolling_view_behavior" > 
    
         <!-- 
          rest of your fragment layout goes here 
          it needs to have a scrolling component 
          --> 
    
         <!-- 
          you *might* need a spacer in order to see 
          the bottom of your view over the top of 
          the buttons 
          --> 
         <Space 
          android:layout_width="match_parent" 
          android:layout_height="48dp" /> 
         <!-- or you could put a bottom margin on your layout --> 
    
        </RelativeLayout> 
    
        <LinearLayout 
         android:layout_width="match_parent" 
         android:layout_height="48dp" 
         android:layout_gravity="bottom"> 
    
         <!-- your buttons go here --> 
    
        </LinearLayout> 
    
    </android.support.design.widget.CoordinatorLayout> 
    
+0

L'unico modo in cui funziona per me è l'aggiunta di android: paddingBottom = "? Attr/actionBarSize" –

+1

Aggiungo android: paddingBottom = "? Attr/actionBarSize" nel frammento del pulsante. E quindi con ogni frammento in cui ho messo gli elementi nella parte inferiore dello schermo :( –