tipos patrones ejemplos diseño comportamiento arquitectura android behavior android-coordinatorlayout

android - patrones - Coordinador comportamiento diseño de diseño personalizado nunca se llama



patrones de diseño web (2)

En primer lugar, me gustaría comenzar con mi falta de conocimiento sobre el diseño del coordinador. Simplemente estoy siguiendo los tutoriales que encontré en línea y tengo curiosidad por saber por qué mi comportamiento no funciona.

¿La vista del niño dentro del diseño del coordinador tiene que ser el diseño de la barra de aplicaciones? ¿O eres capaz de poner alguna vista dentro?

Además, cuando defino el espacio de nombres res-auto, no me da la opción de layout_behavior. Por lo general, Android Studio se completará automáticamente si una función está disponible y no lo hizo. Aunque, si escribo layout_behavior no se queja. ¿Entonces tal vez está funcionando ...?

En cualquier caso, he definido mi propio comportamiento de diseño personalizado y estoy tratando de aplicarlo, pero no parece estar funcionando. Cualquier idea sería muy apreciada.

Aquí está el diseño. Estoy intentando aplicar mi comportamiento personalizado al primer LinearLayout (search_polls_toolbar) y hacer que se desplace hacia arriba cuando la vista de reciclaje vertical se desplace hacia arriba. (Al igual que la barra de herramientas actualmente). También debo mencionar que este xml es para un fragmento en un viewpager. Y la actividad de hospedaje tiene un diseño de coordinador adjunto que hace que la barra de herramientas se desplace hacia arriba. (¿Podría estar en conflicto por eso?)

<?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"/>

Y aquí está el comportamiento personalizado:

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; } }

Y aquí está el diseño de las actividades de alojamiento.

<?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>

Si alguien desea que publique más de mi código, ¡por favor hágamelo saber! Gracias :)


La razón por la que no funciona es que la vista con Behavior debe ser un hijo directo de CoordinatorLayout . En su caso, la jerarquía es: CoordinatorLayout -> RelativeLayout -> LinearLayout (with Behavior ).


Tengo un diseño como este. Hay algunas cosas ubicadas en las regiones superiores, pero la parte inferior contiene solo un FAB que está profundamente anidado.

<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>

La FAB está profundamente anidada.

CoordinatorLayout > ConstraintLayout > RelativeLayout > FABProgressCircle > FAB

Sin embargo, el CoordinatorLayout debe subir el RelativeLayout cuando se muestra el Snackbar .

El comportamiento que hará esto es tan simple como sigue.

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; } }

Muestra el Snackbar esta manera.

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

onDependentViewRemoved debe onDependentViewRemoved , porque al descartar manualmente un Snackbar el CoordinatorLayout no activará el movimiento de la View traducida (el FloatingActionButton y su RelativeLayout ) a su lugar original. Anulando el método podemos traducirlo de nuevo a donde estaba.