7

Próbuję zaimplementować funkcję pull do odświeżenia, ale mam problem z SwipeRefreshLayout nie zawijaniem wysokości widoku podrzędnego. W podglądzie widoku oraz w kompilacji na żywo wydaje się mieć 0 wysokości.SwipeRefreshLayout w AppBarLayout nie pakuje treści

Układ jak w następujący sposób:

<android.support.design.widget.AppBarLayout 
    android:id="@+id/app_bar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:elevation="0dp"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@android:color/transparent" 
     app:layout_collapseMode="pin"> 

     <android.support.v4.widget.SwipeRefreshLayout 
      android:id="@+id/swipe_refresh_layout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

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

     </android.support.v4.widget.SwipeRefreshLayout> 
    </android.support.v7.widget.Toolbar> 

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

Próbowałem również dokonywania SwipeRefreshLayout rodzicem AppBarLayout bez powodzenia, a także wprowadzenie swoistą LinearLayout wewnątrz SwipeRefreshLayout. Jedyną rzeczą, która zdaje się uniemożliwiać wysokość układu przesunięcia od 0, jest ustawienie statyczne, ale chcę, aby była dynamiczna w oparciu o wysokość widoku podrzędnego.

Czy jest tu coś, czego mi brakuje? Wygląda na to, że może wystąpić błąd z SwipeRefreshLayout, ponieważ zastąpienie go przez LinearLayout, który również zawija treść, działa zgodnie z oczekiwaniami.

+0

Co się dzieje w przypadku zmiany 'layout_height' widoku SwipeRefreshLayout do' match_parent'? Po prostu myśl o tym na zewnątrz .. – Phix

+3

Czy możesz opublikować kod dla 'child_layout'. – Kiya

+0

dlaczego robisz na pasku narzędzi? Dlaczego nie chcesz go rozdzielić? – Saveen

Odpowiedz

4

Problem polega na tym, że SwipeRefreshLayout znajduje się wewnątrz Toolbar i. Musisz zapakować AppBarLayout w inny układ i umieścić SwipeRefreshLayout poniżej AppBarLayout. Przykład znajduje się poniżej.

<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
xmlns:tools="http://schemas.android.com/tools" 
android:fitsSystemWindows="true" 
tools:context="com.vsahin.moneycim.View.MainActivity"> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/app_bar_layout" 
    android:layout_width="match_parent" 
    android:layout_height="250dp" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark" 
    android:fitsSystemWindows="true" 
    app:expanded="false"> 

    <android.support.design.widget.CollapsingToolbarLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed" 
     app:contentScrim="?attr/colorPrimary" 
     android:fitsSystemWindows="true" 
     android:background="@drawable/gradient_background"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      app:layout_collapseMode="pin" 
      app:layout_scrollFlags="scroll|enterAlways" /> 

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

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

<android.support.v4.widget.SwipeRefreshLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 

</android.support.v4.widget.SwipeRefreshLayout> 

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

Zapomniałem umieścić w moim oryginalnym wpisie, ale jest widok Recyklera z dolnym arkuszem pod układem paska aplikacji. Problem polega na tym, że potrzebny jest układ paska aplikacji dla efektu paralaksy, gdy dolny arkusz jest otwarty, ale chcę tylko wspierać przeciąganie, aby odświeżyć układ paska aplikacji. –

1

jeśli wysokość SwipeRefreshLayout jest owijanie zawartość swojej child_layout, wówczas wysokość child_layout powinien być ustawiony na match_parent lub oba SwipeRefreshLayout i child_layout wysokość należy ustawić na match_parent jak pokazano na Android Documentation

<android.support.v4.widget.SwipeRefreshLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/swiperefresh" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
     <!--Child View--> 
    <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</android.support.v4.widget.SwipeRefreshLayout> 
0

SwipeRefreshLayout jest przezroczystym View, więc najlepsze rozwiązanie, aby ustawić to match_parent nie będzie konfliktu z innymi widokami i nie obejmują View lub Layout w nim, utrzymać go w czystości

<android.support.v4.widget.SwipeRefreshLayout 
      android:id="@+id/swipe_refresh_layout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/app_bar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:elevation="0dp"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@android:color/transparent" 
     app:layout_collapseMode="pin"> 

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

    </android.support.v7.widget.Toolbar> 

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

SwipeRefreshLayout musi być w górze, aby nałożyć inne warstwy i być klikalne

Powiązane problemy