协调员布局自定义布局行为永远不会被调用

首先,我想先介绍一下,因为我对协调员布局缺乏了解。 我只是跟随我在网上find的教程,很好奇为什么我的行为不工作。

协调器布局内的子视图是否必须是应用栏布局? 或者你可以在里面放任何视图。

另外,当我定义res-auto命名空间时,它不会给我layout_behavior的选项。 通常android studio会自动完成,如果一个function可用,它不会。 虽然,如果我inputlayout_behavior它不会抱怨。 所以也许它正在工作…?

无论如何,我已经定义了自己的自定义布局行为,并试图应用它,但似乎没有工作。 任何有识之士将不胜感激。

这是布局。 我试图将自定义行为应用到第一个LinearLayout(search_polls_toolbar),并在垂直recyclerview向上滚动时向上滚动。 (就像当前的工具栏一样)。我还应该提到,这个XML是在viewpager中的一个片段。 主办活动有一个协调员布局,它使工具栏向上滚动。 (因为这个原因可能会发生冲突吗?)

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout android:id="@+id/root" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/search_polls_toolbar" android:layout_width="match_parent" android:layout_height="?android:actionBarSize" android:background="@color/icitizen_toolbar_orange" android:weightSum="1" app:layout_behavior="com.example.chrisjohnson.icitizenv2.CustomBehaviors.ToolbarBehavior" > <EditText android:id="@+id/search_polls" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="@string/search_polls" android:gravity="center_horizontal" android:layout_weight=".5" android:drawableLeft="@drawable/magnifying_glass" android:drawableStart="@drawable/magnifying_glass" android:layout_marginTop="5dp" android:layout_marginLeft="15dp" android:drawablePadding="-50dp" android:paddingLeft="5dp" android:paddingTop="5dp" android:paddingBottom="10dp" android:cursorVisible="false" android:textSize="20sp" android:background="@color/icitizen_light_orange" /> </LinearLayout> <android.support.v7.widget.RecyclerView android:id="@+id/poll_horizontal_recycler_view" android:layout_width="match_parent" android:layout_height="75dp" android:layout_below="@id/search_polls_toolbar" android:layout_marginLeft="10dp" android:layout_marginTop="5dp" android:scrollbars="none" > </android.support.v7.widget.RecyclerView> <android.support.v7.widget.RecyclerView android:id="@+id/poll_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp" android:layout_below="@id/poll_horizontal_recycler_view" app:layout_scrollFlags="scroll|enterAlways" android:scrollbars="vertical" /> </RelativeLayout> <android.support.design.widget.FloatingActionButton android:id="@+id/polls_fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/white_plus_icon" android:layout_marginBottom="70dp" app:backgroundTint="@color/icitizen_orange" app:layout_anchor="@id/container" app:layout_anchorGravity="bottom|right|end" app:borderWidth="0dp" android:layout_marginRight="15dp" android:layout_marginEnd="15dp"/> 

这是自定义行为:

 public class ToolbarBehavior extends CoordinatorLayout.Behavior<Toolbar> { public ToolbarBehavior(Context context, AttributeSet attrs) { super(context, attrs); Toast.makeText(context, "AJSJA", Toast.LENGTH_LONG).show(); } @Override public boolean layoutDependsOn(CoordinatorLayout parent, Toolbar child, View dependency) { return dependency instanceof RecyclerView; } @Override public boolean onDependentViewChanged(CoordinatorLayout parent, Toolbar child, View dependency) { child.setTranslationY(child.getY()); return true; } } 

这里是托pipe活动的布局。

  <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/coordinatorLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?android:attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/home_viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout> 

如果有人希望我发布我的代码,请让我知道! 谢谢 :)

Solutions Collecting From Web of "协调员布局自定义布局行为永远不会被调用"

它不工作的原因是Behavior视图必须是CoordinatorLayout的直接子。 在你的情况下,层次结构是: CoordinatorLayout – > RelativeLayout – > LinearLayout (与Behavior )。

我有这样的布局。 在上部地区有一些东西,但底部只包含深深嵌套的FAB。

 <android.support.design.widget.CoordinatorLayout android:id="@+id/your_coordinator_id"> <android.support.constraint.ConstraintLayout app:layout_behavior="com.yourpackage.YourBehavior"> <ScrollView> ... </ScrollView> <android.support.design.widget.TextInputLayout> ... </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout> ... </android.support.design.widget.TextInputLayout> <!-- Everything "around" the FAB needs to be moved. --> <RelativeLayout android:id="@+id/your_view_id"> <com.github.jorgecastilloprz.FABProgressCircle> <!-- This is the actual FAB. --> <android.support.design.widget.FloatingActionButton/> </com.github.jorgecastilloprz.FABProgressCircle> </RelativeLayout> </android.support.constraint.ConstraintLayout> </android.support.design.widget.CoordinatorLayout> 

FAB深深嵌套。

CoordinatorLayout > ConstraintLayout > RelativeLayout > FABProgressCircle > FAB

然而,当显示Snackbar时, RelativeLayout需要被CoordinatorLayout推上去。

这样做的行为如下简单。

 package com.yourpackage; ... public class YourBehavior extends CoordinatorLayout.Behavior<ConstraintLayout> { public YourBehavior(Context context, AttributeSet attrs) { } @Override public boolean onDependentViewChanged(CoordinatorLayout parent, ConstraintLayout child, View dependency) { float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight()); // Note that the RelativeLayout gets translated. child.findViewById(R.id.your_view_id).setTranslationY(translationY); return true; } @Override public void onDependentViewRemoved(CoordinatorLayout parent, ConstraintLayout child, View dependency) { child.findViewById(R.id.your_view_id).setTranslationY(0.0f); } @Override public boolean layoutDependsOn(CoordinatorLayout parent, ConstraintLayout child, View dependency) { return dependency instanceof Snackbar.SnackbarLayout; } } 

像这样显示Snackbar

 Snackbar.make(findViewById(R.id.your_coordinator_id), "Message", Snackbar.LENGTH_SHORT).show(); 

onDependentViewRemoved需要被覆盖,因为当手动closuresSnackbarCoordinatorLayout将不会触发将已翻译的ViewFloatingActionButton及其RelativeLayout )移回原始位置。 重写该方法,我们可以将其翻译回原来的位置。