Cómo agregar el botón de acción flotante en la parte superior de scrollview

Tengo un botón de acción flotante que me gustaría añadir en la parte superior de un scrollview para que el botón permanece, incluso si se desplaza. Lo quiero en la parte superior de la vista de desplazamiento y en la esquina inferior derecha de la pantalla. ¿Qué combinación de puntos de vista necesito usar para lograr esto?

Aquí está el archivo xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:fab="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.nhscoding.safe2tell.STORIES" android:background="@color/stor_back"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom" > <com.getbase.floatingactionbutton.FloatingActionButton android:id="@+id/pink_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" fab:fab_icon="@drawable/ic_add" fab:fab_colorNormal="@color/fab_back" fab:fab_colorPressed="@color/fab_pressed_back" android:layout_gravity="end" android:layout_marginBottom="16dp" android:layout_marginRight="16dp"/> </LinearLayout> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view1" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card1_title" android:textSize="@dimen/card_title_size" android:gravity="top" android:id="@+id/title1" /> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view2" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius" android:layout_below="@id/card_view1"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card2_title" android:textSize="@dimen/card_title_size" android:gravity="top" /> <TextView android:id="@+id/info_text2" android:layout_marginTop="16dp" android:layout_marginBottom="0dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view3" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius" android:layout_below="@id/card_view2"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card3_title" android:textSize="@dimen/card_title_size" android:gravity="top" /> <TextView android:id="@+id/info_text3" android:layout_marginTop="16dp" android:layout_marginBottom="0dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_width="wrap_content" android:layout_height="match_parent"/> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view1" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card4_title" android:textSize="@dimen/card_title_size" android:gravity="top" android:id="@+id/title4" /> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view1" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="16dp" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card5_title" android:textSize="@dimen/card_title_size" android:gravity="top" android:id="@+id/title5" /> </android.support.v7.widget.CardView> </LinearLayout> </ScrollView> </RelativeLayout> 

Los niños más tarde en un RelativeLayout tienden a flotar sobre los niños más tempranos en un RelativeLayout .

(Digo "tienden a" porque las cosas de elevation Android 5.0 también desempeña un papel, y la relación entre ellos es mal definida)

Por lo tanto, para tener un float FAB sobre un ScrollView en un RelativeLayout , asegúrese de que el ScrollView se define primero en el XML, con el FAB después. Esto no afectará a las reglas X / Y, pero debería tener el FAB aparecer sobre el ScrollView en el eje Z.

Otra posibilidad, si solo estás soportando Android 5.0+, sería usar android:elevation sí para elevar el FAB.

prueba esto:

Androide: layout_alignParentRight = "true"

Androide: layout_alignParentBottom = "true"

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:fab="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.nhscoding.safe2tell.STORIES" android:background="@color/stor_back"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view1" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card1_title" android:textSize="@dimen/card_title_size" android:gravity="top" android:id="@+id/title1" /> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view2" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius" android:layout_below="@id/card_view1"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card2_title" android:textSize="@dimen/card_title_size" android:gravity="top" /> <TextView android:id="@+id/info_text2" android:layout_marginTop="16dp" android:layout_marginBottom="0dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view3" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius" android:layout_below="@id/card_view2"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card3_title" android:textSize="@dimen/card_title_size" android:gravity="top" /> <TextView android:id="@+id/info_text3" android:layout_marginTop="16dp" android:layout_marginBottom="0dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_width="wrap_content" android:layout_height="match_parent" /> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view1" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card4_title" android:textSize="@dimen/card_title_size" android:gravity="top" android:id="@+id/title4" /> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view1" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="16dp" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card5_title" android:textSize="@dimen/card_title_size" android:gravity="top" android:id="@+id/title5" /> </android.support.v7.widget.CardView> </LinearLayout> </ScrollView> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="bottom" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:layout_margin="10dp"> <com.getbase.floatingactionbutton.FloatingActionButton android:id="@+id/pink_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" fab:fab_icon="@drawable/ic_add" fab:fab_colorNormal="@color/fab_back" fab:fab_colorPressed="@color/fab_pressed_back" android:layout_gravity="end" android:layout_marginBottom="16dp" android:layout_marginRight="16dp" /> </LinearLayout> </RelativeLayout> 

Puede usar android.support.design.widget.CoordinatorLayout como diseño principal. Hacer dos xml uno en el que se puede establecer la barra de desplazamiento o la lista. Otro es el contenedor de los padres que tiene toda la información con su FloatingActionButton .

Activity_main.xml

 <?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" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context=".MainActivity"> <android.support.design.widget.AppBarLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_main" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" app:elevation="6dp" app:backgroundTint="@color/colorAccent" app:pressedTranslationZ="12dp" android:layout_margin="@dimen/fab_margin" android:src="@drawable/ic_add" /> </android.support.design.widget.CoordinatorLayout> 

Content_main.xml

Aquí puede poner su ScrollBar. Es bastante fácil.

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:gravity="center" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showIn="@layout/activity_main" tools:context=".MainActivity"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view1" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card1_title" android:textSize="@dimen/card_title_size" android:gravity="top" android:id="@+id/title1" /> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view2" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius" android:layout_below="@id/card_view1"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card2_title" android:textSize="@dimen/card_title_size" android:gravity="top" /> <TextView android:id="@+id/info_text2" android:layout_marginTop="16dp" android:layout_marginBottom="0dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view3" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius" android:layout_below="@id/card_view2"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card3_title" android:textSize="@dimen/card_title_size" android:gravity="top" /> <TextView android:id="@+id/info_text3" android:layout_marginTop="16dp" android:layout_marginBottom="0dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:layout_width="wrap_content" android:layout_height="match_parent" /> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view1" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="@dimen/card_margin_bottom" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card4_title" android:textSize="@dimen/card_title_size" android:gravity="top" android:id="@+id/title4" /> </android.support.v7.widget.CardView> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view1" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="@dimen/card_margin_top" android:layout_marginBottom="16dp" android:layout_marginLeft="@dimen/card_margin_left" android:layout_marginRight="@dimen/card_margin_right" card_view:cardCornerRadius="@dimen/card_radius"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/card_title_top" android:layout_marginBottom="@dimen/card_title_bottom" android:layout_marginLeft="@dimen/card_title_left" android:layout_marginRight="@dimen/card_title_right" android:text="@string/card5_title" android:textSize="@dimen/card_title_size" android:gravity="top" android:id="@+id/title5" /> </android.support.v7.widget.CardView> </LinearLayout> </ScrollView> </RelativeLayout> 
  • ¿Volver a calcular ScrollView en diferentes vistas de ViewFlipper?
  • Android TimePicker (Estilo de rueda) no responde correctamente a los gestos de desplazamiento dentro de ScrollView
  • Android ScrollView (desplazable en Horizontal y Vertical suavemente) en el que el contenido se puede agregar programable y zoomable en pinch
  • ¿Por qué no android: windowSoftInputMode = "stateVisible | adjustResize" ajustar la pantalla cuando se muestra el teclado virtual?
  • Cómo desplazarse tableview en android
  • Margen redundante al agregar ImageView a ScrollView en Android
  • ¿Efecto de desplazamiento personalizado para scrollview?
  • No hay impulso de lanzamiento dentro de ScrollView
  • Centro de contenido en vista de desplazamiento
  • ScrollView vs RecyclerView para niños diferentes en Android
  • Coloque un bloque en el centro de un ScrollView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.