Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


AppBarLayout con contenedor FrameLayout como contenido de desplazamiento no funciona

Estoy tratando de usar la más nueva biblioteca de diseño para hacer mi barra de herramientas ocultar / mostrar en el desplazamiento. Mi problema es el contenido de desplazamiento que tengo está en el fragmento, sólo estoy inyectándolo en el contenedor FrameLayout y no funciona. Aquí está mi actividad:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.CoordinatorLayout android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <include layout="@layout/layout_toolbar" /> </android.support.design.widget.AppBarLayout> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout> <FrameLayout android:id="@+id/navigation_drawer_container" android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent" android:layout_gravity="start" tools:layout="@layout/fragment_nav_drawer_anon" /> 

Y mi fragmento:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/pull_to_refresh" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v4.widget.SwipeRefreshLayout> <TextView android:id="@android:id/empty" android:layout_width="match_parent" android:layout_height="match_parent" android:textSize="18sp" android:fontFamily="sans-serif" android:color="@color/dark_grey" android:padding="60dp"/> 

Y barra de herramientas:

 <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" app:layout_scrollFlags="scroll|enterAlways" style="@style/Widget.MyApp.ActionBar" /> 

Estoy siguiendo el documento oficial y esta demo , y todavía no puedo entender cómo hacerlo funcionar.

  • Cambiar el color del icono de desbordamiento de la barra de herramientas
  • Soporte para Android Barra de herramientas que no muestra la costumbre dibujable correctamente
  • ¿Cómo hacer que el fondo de la barra de herramientas de soporte sea transparente?
  • Barra de herramientas de Android + Diseño de pestaña + Cajón, Ocultar barra de herramientas al desplazarse y llevar TabLayout a la parte superior
  • Barra de herramientas de soporte técnico de Android colorControlNormal color
  • Posición de la vista de héroe calculada erróneamente durante la transición de elementos compartidos
  • ¿Cómo se estila la barra de herramientas appcompat-v7 como Theme.AppCompat.Light.DarkActionBar?
  • ¿Cómo reemplazar el icono de la hamburguesa utilizado para ActionBarToggle en la barra de herramientas de Android con una costumbre drawable?
  • 10 Solutions collect form web for “AppBarLayout con contenedor FrameLayout como contenido de desplazamiento no funciona”

    Reemplace su FrameLayout con android.support.v4.widget.NestedScrollView

    NestedScrollView es igual que ScrollView, pero admite actuar como un padre y un hijo de desplazamiento anidados tanto en las versiones nuevas como en las antiguas de Android. El desplazamiento anidado está habilitado de forma predeterminada.

    Enlace a doc

    La razón de este comportamiento es que el Framelayout no especifica un comportamiento. CoordinatorLayout se basa en la vista secundaria para controlar el comportamiento.

    Puedes leer en la parte inferior aquí

    http://android-developers.blogspot.in/2015/05/android-design-support-library.html

    Se afirma que

    CoordinatorLayout y vistas personalizadas

    Una cosa que es importante tener en cuenta es que CoordinatorLayout no tiene ninguna comprensión innata de un trabajo FloatingActionButton o AppBarLayout – sólo proporciona una API adicional en forma de Coordinator.Behavior, que permite a las vistas secundarias controlar mejor los eventos y gestos táctiles Así como declarar dependencias entre sí y recibir devoluciones de llamada a través de onDependentViewChanged ().

    Las vistas pueden declarar un comportamiento predeterminado mediante la anotación CoordinatorLayout.DefaultBehavior (YourView.Behavior.class) o establecerla en los archivos de diseño mediante el atributo app: layout_behavior = "com.example.app.YourView $ Behavior". Este marco permite que cualquier vista se integre con CoordinatorLayout.

    Edit: Aunque FrameLayout no es una vista personalizada, no especifica un comportamiento que CoordinateLayout busca.

    El uso de FrameLayout como hijo de CoordinatorLayout funciona bastante bien. La barra de herramientas se está desplomando como se supone. Tuve un problema al principio, cuando usé bibliotecas anticuadas.

    Estas son las dependencias gradle que estoy usando ahora mismo:

     compile 'com.android.support:appcompat-v7:22.2.1' compile 'com.android.support:cardview-v7:22.2.0' compile 'com.android.support:recyclerview-v7:22.2.0' compile 'com.android.support:design:22.2.0' 

    Estoy usando FrameLayout con la app:layout_behavior="@string/appbar_scrolling_view_behavior" atributo app:layout_behavior="@string/appbar_scrolling_view_behavior" como un hijo de CoordinatorLayout en el diseño de una actividad. FrameLayout sirve como contenedor para fragmentos. Los elementos raíz de mis fragmentos son un RecyclerView o un NestedScrollView .

    Aquí está el diseño de la actividad:

      <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/..." android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <android.support.design.widget.AppBarLayout android:layout_height="192dp" android:layout_width="match_parent" > <android.support.design.widget.CollapsingToolbarLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed" > <ImageView android:id="@+id/.." android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:scaleType="centerCrop" android:src="@drawable/..." app:layout_collapseMode="parallax"/> <android.support.v7.widget.Toolbar android:id="@+id/toolbar_sessions" android:layout_height="?attr/actionBarSize" android:layout_width="match_parent" app:layout_collapseMode="pin" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> </android.support.design.widget.CoordinatorLayout> 

    El diseño de mi primer fragmento se ve así:

     <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="..." /> 

    El diseño de mi segundo fragmento se ve así:

     <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="..." android:layout_width="match_parent" android:layout_height="match_parent" tools:context="..." > ... </android.support.v4.widget.NestedScrollView> 

    En mi aplicación sólo funciona con RecyclerView. Tal vez debería usar RecyclerView en lugar de ListView.

    Es una buena pregunta. Yo también tenía lo mismo.

    Su contenedor FrameLayout se define correctamente el problema reside en el Fragment . El Fragment debería tener RecyclerView y no ListView ya que ahora está obsoleto.

    Ejemplo:

     <android.support.v7.widget.RecyclerView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" android:paddingTop="@dimen/activity_vertical_margin"/> 

    Yo uso la misma estructura en mi aplicación y funciona perfecto.

    Puede obtener desplazamiento con Framelayout dentro de su CoordinatorLayout. Para ello, debes usar app:layout_behavior="@string/appbar_scrolling_view_behavior" dentro de tu frameLayout , así como dentro de la vista de desplazamiento con la que deseas este efecto colapsante.

    Para ex- Si está inflando RecyclerView dentro de su frameLayout, entonces usted tiene que usar app:layout_behavior="@string/appbar_scrolling_view_behavior" dentro de su recyclerrView también.

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </Relativelayout> 

    o,

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" android:orientation="vertical"> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_above="@+id/bNext" android:fillViewport="true" android:scrollbars="none" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <!-- your content --> </android.support.v4.widget.NestedScrollView> </Relativelayout> 

    Por lo tanto, utilizando este proceso puede lograr desplazamiento con frameLayout si contiene reciclador o nestedScrollview.

    ListView no implementa NestedScrollingChild por lo que no funciona.

    RecyclerView hace, por lo que puede propagar el desplazamiento a la NestedScrollingParent (el CoordinatorLayout).

    Sólo necesita reemplazar

    FrameLayout

    a

    Android.support.v4.widget.NestedScrollView

    De este modo:

     <android.support.design.widget.CoordinatorLayout android:id="@+id/root_coordinator" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/app_bar_layout" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:contentScrim="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways"> <ImageView android:layout_width="match_parent" android:layout_height="192dp" android:scaleType="centerCrop" android:src="@drawable/header" app:layout_collapseMode="parallax" /> <android.support.v7.widget.Toolbar android:id="@+id/app_bar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:layout_collapseMode="pin" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <!-- This was before FrameLayout --> <android.support.v4.widget.NestedScrollView android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> </android.support.v4.widget.NestedScrollView> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" android:layout_margin="16dp" android:src="@drawable/ic_drawer_alertas" app:borderWidth="0dp" app:fabSize="mini" /> </android.support.design.widget.CoordinatorLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation_drawer" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/drawer_header" app:itemIconTint="@color/colorAccent" app:itemTextColor="@color/colorSecondaryText" app:menu="@menu/menu_main" /> 

    Debe agregar comportamiento a la vista de desplazamiento:

     <android.support.v4.widget.SwipeRefreshLayout android:layout_marginTop="5dp" android:id="@+id/swipe_main" android:enabled="false" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <com.marshalchen.ultimaterecyclerview.UltimateRecyclerView android:id="@+id/rvUserProfile" app:recyclerviewEmptyView ="@layout/ev_home" app:recyclerviewClipToPadding="false" android:layout_width="match_parent" android:layout_height="match_parent"></com.marshalchen.ultimaterecyclerview.UltimateRecyclerView> </android.support.v4.widget.SwipeRefreshLayout> 

    Mover la app:layout_scrollFlags="scroll|enterAlways" desde la barra de herramientas hasta el Framelayout. Perdón por llegar tarde.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.