我有一个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" />
答案 0 :(得分:0)
确保将正确的视图传递给Snackbar.make()
方法。根据文档,
Snackbar将尝试查找父视图,以便从给定视图的值中保存Snackbar的视图。 Snackbar将沿着视图树向上走,试图找到一个合适的父级,它被定义为CoordinatorLayout或窗口装饰的内容视图,以先到者为准。
因此,您应该传递一个实际位于CoordinatorLayout
内的视图,以便Snackbar将协调器视为第一个可用的父级。
答案 1 :(得分:0)
我找到了解决方案。您显然必须移动到新设计库中的导航视图窗口小部件。转向此并保持其他所有不变,FAB再次动画。
有关实施,请参阅Chris Banes的图书馆的The official blog post for the support libary和this demo。
这不是一个理想的解决方案,因为你失去了片段对静态膨胀的XML资源的灵活性,但这是我发现使FAB仍然具有动画效果的唯一方法。