簡體   English   中英

當出現Snackbar時,FAB的底部填充消失了

[英]Bottom padding of FAB gone when Snackbar appears

莫因,

我在CoordinatorLayout內部使用FAB遇到奇怪的行為。
當出現Snackbar ,FAB會向上滑動,但會直接SnackbarSnackbar而不會產生任何padding (第二張圖像)。
Snackbar消失后,FAB向下移動到屏幕邊緣且沒有填充(第三張圖像),直到幾秒鍾后,當FAB再次神奇地向上移動(布局重新生效?)並且填充恢復正常(第四次)時圖片)。

我已經從API 16到23對此進行了測試。

第1步

第2步

第三步:

第四步

我的布局如下所示:

<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

我最近遇到了同樣的問題。 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的默認值為bottom。

此外,CoordinatorLayout允許我們使用視圖的矩形定義我們自己的矩形,而不是使用它。 這可以通過在我們的行為中覆蓋getInsetDodgeRect來完成。 FAB會這樣做,而問題就從這里開始。

在棒棒糖之前的設備上或將useCompatPadding設置為true時,FAB將添加用於繪制陰影的填充。 這是必要的,因為棒棒糖之前的視圖無法在其邊界之外繪制陰影。

根據FAB默認行為的評論,添加陰影填充后,FAB應將其自身偏移回到其原始位置。 但是,這沒有發生。 另一方面,躲閃插入rect仍然偏移,因此在Snackbar遮住陰影之后將FAB向上推,然后一直拖動到底部。 上面的解決方案基本上將其恢復為默認值。

在這一點上,我仍然不知道為什么抵消FAB不能按預期進行。 也許如果有人可以提供更多有關此的信息,則可以找到更好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM