FloatingActionButton行为回调在DrawerLayout

时间:2015-06-20 08:32:42

标签: android android-design-library floating-action-button android-coordinatorlayout

我有一个DrawerLayout,其中一个Coordinator布局作为主要内容托管。当我使用Snackbar.make方法创建SnackBar时,协调器布局中托管的FAB拒绝设置动画。

我发现这很奇怪,因为我在协调器布局中使用了相同的FAB,而这些布局并没有包含在DrawerLayout中,并且它的动画效果很好,导致相信DrawerLayout以某种方式阻止了回调。 / p>

我尝试将CoordinatorLayout设置为顶级视图,包装DrawerLayout,但这也不起作用。我要尝试的是分叉FloatingActionButton Behavior类并使updateFabTranslationForSnackbar方法公开,以便我自己调用它。我更不愿意这样做,所以任何想法都会受到高度赞赏。

对于这两个活动,Snackbar.make调用是从一个动态添加到RelativeLayout的片段调用的,其ID为#34; container"。传递给调用的视图是活动XML中的CoordinatorLayout,其ID为#34; coordinator_layout"。

同样,一切都在第一个XML中工作,但在第二个XML中没有。

这是我的其他活动的默认XML,FAB在这里动画很好:

<android.support.design.widget.CoordinatorLayout
android:id="@+id/coordinator_layout"
android:name="com.app.mobile.app.ui.BusinessActivityFragment"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ProgressBar
    android:id="@+id/progress_bar"
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginBottom="8dp" />

<RelativeLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="gone">

    <ImageView
        android:id="@+id/background"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:scaleType="centerCrop"
        android:src="@drawable/bg_sign_up"
        android:visibility="invisible" />

    <View
        android:id="@+id/background_mask"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:background="@color/black_40"
        android:visibility="invisible" />
</RelativeLayout>

<include
    android:id="@+id/action_bar"
    layout="@layout/toolbar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/abc_action_bar_default_height_material"
    android:layout_gravity="top" />

<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="16dp" />

<ProgressBar
    android:id="@+id/load_more"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="@dimen/half_margin"
    android:layout_gravity="bottom"
    android:indeterminate="true"
    android:visibility="gone" />

这是我的主要活动的XML,其中FAB拒绝动画:

<android.support.v4.widget.DrawerLayout
android:id="@+id/navigation_layout"
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.app.mobile.app.ui.HomeActivity">
<!-- As the main content view, the view below consumes the entire
     space available using match_parent in both dimensions. -->
<android.support.design.widget.CoordinatorLayout
    android:id="@+id/coordinator_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true">
    <!-- Toolbar is the last item in the FrameLayout to cause it to overlay -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:animateLayoutChanges="true"
        android:orientation="vertical">

        <ProgressBar
            android:id="@+id/home_progress"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_gravity="center"
            android:layout_marginBottom="8dp" />

        <RelativeLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone" />
    </RelativeLayout>

    <include
        android:id="@+id/action_bar"
        layout="@layout/toolbar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/abc_action_bar_default_height_material"
        android:layout_gravity="top" />

    <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="16dp" />

    <ProgressBar
        android:id="@+id/load_more"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="@dimen/half_margin"
        android:layout_gravity="bottom"
        android:indeterminate="true"
        android:visibility="gone" />
</android.support.design.widget.CoordinatorLayout>
<!-- android:layout_gravity="start" tells DrawerLayout to treat
     this as a sliding drawer on the left side for left-to-right
     languages and on the right side for right-to-left languages.
     If you're not building against API 17 or higher, use
     android:layout_gravity="left" instead. -->
<!-- The drawer is given a fixed width in dp and extends the full height of
     the container. -->
<fragment
    android:id="@+id/navigation_drawer"
    android:name="com.app.mobile.app.ui.NavigationDrawerFragment"
    android:layout_width="300dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:tag="NAVIGATION_DRAWER_TAG"
    tools:layout="@layout/fragment_navigation_drawer" />

2 个答案:

答案 0 :(得分:0)

确保将正确的视图传递给Snackbar.make()方法。根据文档,

  

Snackbar将尝试查找父视图,以便从给定视图的值中保存Snackbar的视图。 Snackbar将沿着视图树向上走,试图找到一个合适的父级,它被定义为CoordinatorLayout或窗口装饰的内容视图,以先到者为准。

因此,您应该传递一个实际位于CoordinatorLayout内的视图,以便Snackbar将协调器视为第一个可用的父级。

答案 1 :(得分:0)

我找到了解决方案。您显然必须移动到新设计库中的导航视图窗口小部件。转向此并保持其他所有不变,FAB再次动画。

有关实施,请参阅Chris Banes的图书馆的The official blog post for the support libarythis demo

这不是一个理想的解决方案,因为你失去了片段对静态膨胀的XML资源的灵活性,但这是我发现使FAB仍然具有动画效果的唯一方法。