8

Mam działanie, które ma 3 karty. Każda strona zakładek jest fragmentem wyświetlającym widok RecyclerView. Jeden z fragmentów ma w sobie FloatingActionButton. Wdrażam ten przycisk w układzie Fragmentu. Robię to również statycznie w prawym dolnym rogu Fragmentu.Pokaż/ukryj zmienną FloatingAction na przesuwie ViewPager

układ Fragment:

- CoordinatorLayout 
    - RecyclerView 
    - FAB (without any behavior) 

W układ aktywny, mam:

- CoordinatorLayout 
    - AppBarLayout 
     - Toolbar 
     - TabLayout (SmartTabLayout) 
    - ViewPager 

Problem teraz jest FAB jest pół-ukryte przed wzrokiem, gdy pasek jest rozwinięty, ale w pełni widoczne, gdy Pasek narzędzi jest zwinięty. Chociaż tak się nie stanie, jeśli zaimplementuję przycisk FAB w samym działaniu. Ale nie chcę mieć przycisku we wszystkich Fragmentach. Wkładam go tylko do pierwszego Fragmentu.

Oto gif, który zrobiłem, aby wyjaśnić to jaśniej.

Fab hidden

XML układ aktywny:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/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.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:minHeight="?attr/actionBarSize" 
      android:background="@color/color_primary" 
      app:layout_scrollFlags="scroll|enterAlways" /> 

     <com.ogaclejapan.smarttablayout.SmartTabLayout 
      android:id="@+id/viewpagertab" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/tab_height" 
      android:background="@color/color_primary" /> 

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

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

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

XML dla układu fragment:

<?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" 
    android:id="@+id/coordinatorLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/card_list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab_add" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_margin="@dimen/fab_margin" 
     android:src="@drawable/ic_plus_white_48dp" 
     app:layout_anchor="@id/card_list" 
     app:layout_anchorGravity="bottom|right|end" /> 

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

Moje pytanie brzmi jak mogę zrobić tak, że przycisk pozostaje widoczna, gdy recyclerview przewinie ?

Odpowiedz

4

Najlepszym rozwiązaniem byłoby po prostu włożenie elementu FloatingActionButton do działania i wywołanie show() i hide() w postaci ViewPager.OnPageChangeListener. W ten sposób uzyskasz niezłą enter/exit animations, która jest zgodna z Material Design guidelines.

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageSelected(int position) { 
     if (position == 0) { 
      fabAdd.show(); 
     } else { 
      fabAdd.hide(); 
     } 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 

    } 
}); 

Wynik:

enter image description here

+1

Myślę, że użyję twojego rozwiązania, ponieważ zapewnia więcej funkcji. Dzięki za Twoją sugestię! – AimanB

+1

@AimanB Jeszcze jedno, należy użyć najnowszej wersji biblioteki projektowania wsparcia, naprawiono wiele problemów w najnowszych wersjach, z których jedna to domyślne animacje pokazane za pomocą metod 'show()' i 'hide()'. –

1

Dodaj

app:layout_behavior="@string/appbar_scrolling_view_behavior" 

do RecyclerView też.

+0

To nie ma żadnego efektu. – AimanB