2017-02-13 100 views
2

莫因,底部填充,當小吃吧出現

我遇到了一個FAB內CoordinatorLayout一個奇怪的行爲。
當出現Snackbar時,FAB向上滑動,但直接粘到Snackbar而沒有任何padding(第二幅圖像)。
Snackbar消失後,FAB向下移動到屏幕邊緣,沒有填充(第三張圖像),直到幾秒鐘後,當FAB再次神奇地向上移動時(佈局重新驗證?),填充恢復正常(第四張圖片)。

我從API 16測試這23

step1

step2

step3

step4

我的佈局是這樣的:

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

    <android.support.design.widget.CoordinatorLayout 
     android:id="@+id/coordinatorLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

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

     <LinearLayout 
      android:id="@+id/empty" 
      [...] 
     </LinearLayout> 


     <android.support.design.widget.FloatingActionButton 
      android:id="@+id/fabAdd" 
      style="@style/MyTheme.FloatingActionButton" 
      app:layout_anchor="@id/recycler" 
      app:layout_anchorGravity="bottom|right|end" 
      app:useCompatPadding="true"/> 

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

的主題,根據如下:

<style name="MyTheme.FloatingActionButton" parent="Widget.Design.FloatingActionButton"> 
    <item name="android:layout_width">56dp</item> 
    <item name="android:layout_height">56dp</item> 
    <item name="android:layout_gravity">bottom|right</item> 
    <item name="android:layout_marginRight">6dp</item> 
    <item name="android:scaleType">center</item> 
</style> 

有沒有人有一個線索是什麼原因導致這種行爲? 我希望FAB始終保留padding

回答

0

我最近遇到了同樣的問題。 TL; DR;我解決了它的:

public class MyFabBehavior extends FloatingActionButton.Behavior { 
    public MyFabBehavior() { 
     super(); 
    } 

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

    @Override 
    public boolean getInsetDodgeRect(
      @NonNull CoordinatorLayout parent, 
      @NonNull FloatingActionButton child, 
      @NonNull Rect rect) { 
     return false; 
    } 
} 

說明:

CoordinatorLayout允許其子女設置dodgeInsetEdges。它是一個重力值。當另一個孩子移動到我們視圖的矩形中時,如果沒有這個參數,它們會重疊。但是,使用dodgeInsetEdges設置的CoordinatorLayout將移動我們的視圖以避免與指定方向重疊。 FAB的默認值是底部。

此外CoordinatorLayout允許我們,而不是使用視圖的矩形來定義我們自己的。這可以通過在我們的行爲中重寫getInsetDodgeRect來完成。 FAB這樣做,而且問題出現在哪裏。

在預棒棒糖設備上或當useCompatPadding設置爲true時,FAB將添加用於繪製其陰影的填充。這是必要的,因爲對前棒棒糖的看法不能在他們的界限之外畫出陰影。

根據FAB默認行爲中的註釋,添加陰影填充後,FAB應該將自己偏移回原來的位置。然而,這並未發生。另一方面,閃避嵌入矩形仍然偏移,因此在Snackbar覆蓋陰影后將FAB推起,然後一直拖到底部。上述解決方案基本上將其恢復爲默認值。

在這一點上,我仍然不知道爲什麼抵消FAB不按預期工作。也許如果有人可以提供更多的信息,可以找到更好的解決方案。