2016-12-14 11 views
17

Я обновляю до последней версии библиотеки поддержки и поведение прокрутки FAB не работает. При прокрутке вниз по RecyclerView он правильно прокручивается, но при прокрутке снова это не так. Он остается скрытым. Снижение до 25.0.1, похоже, смягчает эту проблему. Для справки здесь используется код, который я использую для этого.25.1.0 Поддержка Android lib нарушает поведение fab

<android.support.v4.widget.DrawerLayout 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/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:animateLayoutChanges="true" 
    android:fitsSystemWindows="true" 
    tools:context=".mainhost.MainActivity" 
    tools:openDrawer="start"> 

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

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

     <android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/collapsing_toolbar_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:fitsSystemWindows="true" 
     app:contentScrim="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|enterAlways|snap"> 

     <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     android:focusableInTouchMode="true" 
     app:layout_collapseMode="pin" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 

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

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

    <!-- Layout for content is here. This can be a RelativeLayout --> 

    <FrameLayout 
     android:id="@+id/content_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginLeft="-3dp" 
     android:layout_marginRight="-3dp" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     tools:context="com.globyworks.citykey.mainhost.MainActivity" /> 


    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="@dimen/fab_margin" 
     app:layout_behavior="com.globyworks.citykey.helpers.ScrollingFABBehavior" 
     android:src="@drawable/drawer_new_report_white" /> 

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


    <android.support.design.widget.NavigationView 
    android:id="@+id/navigation_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="@android:color/white" 
    app:menu="@menu/menu_drawer"> 

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


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

А класс скроллинг:

public class ScrollingFABBehavior extends FloatingActionButton.Behavior { 


    public ScrollingFABBehavior(Context context, AttributeSet attrs) { 
     super(); 
    } 

    public boolean onStartNestedScroll(CoordinatorLayout parent, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { 

     return true; 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { 
     if (dependency instanceof RecyclerView) { 
      return true; 
     } 

     return false; 
    } 

    @Override 
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, 
           FloatingActionButton child, View target, int dxConsumed, 
           int dyConsumed, int dxUnconsumed, int dyUnconsumed) { 
     super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, 
          dxUnconsumed, dyUnconsumed 
     ); 
     if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { 
      child.hide(); 
     } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { 
      child.show(); 
     } 
    } 
} 
+0

Я был с та же проблема, все же. наконец, кто-то отправил вопрос! – wax911

ответ

26

В настоящее время CoordinatorLayout пропускает представления, заданные GONE при поиске позывов в своем методе onNestedScroll.

Быстрое обходное решение здесь устанавливает видимость FAB на INVISIBLE на end of the FAB's hide animation.

if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { 
    child.hide(new FloatingActionButton.OnVisibilityChangedListener() { 
     @Override 
     public void onHidden(FloatingActionButton fab) { 
      super.onHidden(fab); 
      fab.setVisibility(View.INVISIBLE); 
     } 
    }); 
} else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { 
    child.show(); 
} 
+0

«В настоящее время» означает, что ожидается, что он изменится? Знаете ли вы, есть ли ошибка или какое-либо обсуждение этого? – khusrav

+0

Я бы предположил, что это ошибка, так как это изменение в поведении было введено в 25.1.0, но я не знаю ни одного выпуска билетов или мнения Google. – jhorvat

+3

https://code.google.com/p/android/issues/detail?id=230298 – Luiz

-1

У меня есть немного того же вопроса с TabView (после обновления до 25.1.0) Это показывает, в первый раз, но второй раз (после заселив) становится невидимым.

+0

ну и что? это не ответ. Downvoted. –

0

Вышеуказанный пользовательский OnVisibilityChangedListener был только частью решения для меня. С заходящего ФАБОМ Невидимого обновлением, это также необходимо обновить еще если условие в onNestedScroll() замещает в настоящее испытание для видимости невидимости, а GONE:

@Override 
public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { 
    super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); 
    if(dyConsumed > 0 && child.getVisibility() == View.VISIBLE){ 
     child.hide(new FloatingActionButton.OnVisibilityChangedListener() { 
      @Override 
      public void onHidden(FloatingActionButton fab) { 
       super.onHidden(fab); 
       fab.setVisibility(View.INVISIBLE); 
      } 
     }); 
    } else if(dyConsumed < 0 && child.getVisibility() == View.INVISIBLE){ 
     child.show(); 
    } 
} 
+0

Поскольку исходный код использует 'child.getVisibility()! = View.VISIBLE' в' else if', это включает 'INVISIBLE' и' GONE'. Пожалуйста, не отправляйте ответы, которые являются лишь незначительными улучшениями для других ответов; комментировать или предлагать изменения. –