En el artículo Ocultar automáticamente o Extender automáticamente el botón de acción flotante para NestedScrollView en Android , se analizó y demostró cómo extender u ocultar automáticamente el botón de acción flotante en la vista de desplazamiento anidado. En este artículo, se analiza cómo ocultar o extender el botón de acción flotante en Android. Mire la siguiente imagen para obtener una descripción general de la discusión.
Crear un proyecto de actividad vacío
Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio .
Agregar dependencia requerida
Incluya la dependencia de componentes de diseño de materiales de Google en el archivo build.gradle . Después de agregar las dependencias, no olvide hacer clic en el botón «Sincronizar ahora» presente en la esquina superior derecha.
implementación «androidx.recyclerview:recyclerview:1.2.1»
Tenga en cuenta que mientras sincroniza su proyecto, debe estar conectado a la red y asegurarse de agregar la dependencia al archivo Gradle de nivel de aplicación como se muestra a continuación.
Pasos para ocultar o extender FAB cuando se desplaza en RecyclerView
Paso 1: trabajar con el archivo activity_main.xml
El diseño principal del proyecto contiene un RecyclerView y un botón de acción flotante normal. Para implementar el mismo diseño, invoque el siguiente código dentro del archivo activity_main.xml.
XML
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/normalFAB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="16dp" android:src="@drawable/ic_add" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Antes de ir a la salida, debemos completar el RecyclerView con los datos. Entonces, ahora debemos trabajar con el adaptador RecyclerView y una vista personalizada para RecyclerView.
Paso 2: Cree una vista personalizada para RecyclerView
La vista personalizada para RecyclerView contiene un ícono simple a la izquierda y dos TextViews. Para implementar lo mismo, cree un archivo llamado recycler_data_view.xml dentro de la carpeta de diseño e invoque el siguiente código.
XML
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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="wrap_content" android:padding="16dp"> <ImageView android:id="@+id/imageView" android:layout_width="54dp" android:layout_height="54dp" android:src="@drawable/ic_android" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/tvNumber" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:textSize="24sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/tvNumbersInText" app:layout_constraintStart_toEndOf="@+id/imageView" app:layout_constraintTop_toTopOf="parent" tools:text="1" /> <TextView android:id="@+id/tvNumbersInText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="@+id/tvNumber" app:layout_constraintTop_toBottomOf="@+id/tvNumber" tools:text="One" /> </androidx.constraintlayout.widget.ConstraintLayout>
La vista personalizada anterior produce el siguiente resultado para cada elemento de la lista:
Paso 3: crear una clase de datos para RecyclerView
Ahora crea los datos para la vista personalizada anterior creando una clase de datos, usando el siguiente código.
Kotlin
data class RecyclerViewData( val text1: String, val text2: String )
Paso 4: Creación del adaptador RecyclerView
El siguiente código debe invocarse en una clase separada creando la clase denominada MyRecyclerAdapter.
Kotlin
import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView class MyRecyclerViewAdapter(private val items: List<RecyclerViewData>) : RecyclerView.Adapter<MyRecyclerViewAdapter.MyRecyclerViewDataHolder>() { inner class MyRecyclerViewDataHolder(itemView: View) : RecyclerView.ViewHolder(itemView) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyRecyclerViewDataHolder { val view: View = LayoutInflater.from(parent.context).inflate(R.layout.recycler_data_view, parent, false) return MyRecyclerViewDataHolder(view) } override fun onBindViewHolder(holder: MyRecyclerViewDataHolder, position: Int) { val currentItem: RecyclerViewData = items[position] val tvNumber: TextView = holder.itemView.findViewById(R.id.tvNumber) tvNumber.text = currentItem.text1 val tvNumbersInText: TextView = holder.itemView.findViewById(R.id.tvNumbersInText) tvNumbersInText.text = currentItem.text2 } override fun getItemCount(): Int { return items.size } }
Paso 5: trabajar con el archivo MainActivity.kt
En esta clase, tenemos que crear algunos datos de muestra para RecyclervView en forma de lista y manejar el detector de desplazamiento para la vista del reciclador cuando se desplaza hacia arriba y hacia abajo. Cuando se desplaza hacia arriba, tenemos que ocultar el FAB y mostrar el FAB cuando se desplaza hacia abajo. Para implementar lo mismo, invoque el siguiente código dentro del archivo MainActivity.kt (se agregan comentarios para una mejor comprensión).
Kotlin
import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.floatingactionbutton.FloatingActionButton class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // create an instance of the Normal Floating Action Button // and register with the appropriate ID val fab: FloatingActionButton = findViewById(R.id.normalFAB) // create instance of RecyclerView and // register with the appropriate ID val recyclerView: RecyclerView = findViewById(R.id.recyclerView) // create list of RecyclerViewData var recyclerViewData = listOf<RecyclerViewData>() recyclerViewData = recyclerViewData + RecyclerViewData("1", "One") recyclerViewData = recyclerViewData + RecyclerViewData("2", "Two") recyclerViewData = recyclerViewData + RecyclerViewData("3", "Three") recyclerViewData = recyclerViewData + RecyclerViewData("4", "Four") recyclerViewData = recyclerViewData + RecyclerViewData("5", "Five") recyclerViewData = recyclerViewData + RecyclerViewData("6", "Six") recyclerViewData = recyclerViewData + RecyclerViewData("7", "Seven") recyclerViewData = recyclerViewData + RecyclerViewData("8", "Eight") recyclerViewData = recyclerViewData + RecyclerViewData("9", "Nine") recyclerViewData = recyclerViewData + RecyclerViewData("10", "Ten") recyclerViewData = recyclerViewData + RecyclerViewData("11", "Eleven") recyclerViewData = recyclerViewData + RecyclerViewData("12", "Twelve") recyclerViewData = recyclerViewData + RecyclerViewData("13", "Thirteen") recyclerViewData = recyclerViewData + RecyclerViewData("14", "Fourteen") recyclerViewData = recyclerViewData + RecyclerViewData("15", "Fifteen") // create a vertical layout manager val layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) // create instance of MyRecyclerViewAdapter val myRecyclerViewAdapter = MyRecyclerViewAdapter(recyclerViewData) // attach the adapter to the recycler view recyclerView.adapter = myRecyclerViewAdapter // also attach the layout manager recyclerView.layoutManager = layoutManager // make the adapter the data set changed for the recycler view myRecyclerViewAdapter.notifyDataSetChanged() // now creating the scroll listener for the recycler view recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) // if the recycler view is scrolled // above hide the FAB if (dy > 10 && fab.isShown) { fab.hide() } // if the recycler view is // scrolled above show the FAB if (dy < -10 && !fab.isShown) { fab.show() } // of the recycler view is at the first // item always show the FAB if (!recyclerView.canScrollVertically(-1)) { fab.show() } } }) } }
Producción:
Para botón de acción flotante extendida
Realice cambios en el archivo activity_main.xml invocando el siguiente código.
XML
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton android:id="@+id/extendedFAB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="16dp" android:text="ADD ITEM" app:icon="@drawable/ic_add" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
Realice cambios dentro del archivo MainActivity.kt invocando el siguiente código.
Kotlin
import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // create an instance of the Normal Floating Action Button // and register with the appropriate ID val fab: ExtendedFloatingActionButton = findViewById(R.id.extendedFAB) // create instance of RecyclerView and register with the appropriate ID val recyclerView: RecyclerView = findViewById(R.id.recyclerView) // create list of RecyclerViewData var recyclerViewData = listOf<RecyclerViewData>() recyclerViewData = recyclerViewData + RecyclerViewData("1", "One") recyclerViewData = recyclerViewData + RecyclerViewData("2", "Two") recyclerViewData = recyclerViewData + RecyclerViewData("3", "Three") recyclerViewData = recyclerViewData + RecyclerViewData("4", "Four") recyclerViewData = recyclerViewData + RecyclerViewData("5", "Five") recyclerViewData = recyclerViewData + RecyclerViewData("6", "Six") recyclerViewData = recyclerViewData + RecyclerViewData("7", "Seven") recyclerViewData = recyclerViewData + RecyclerViewData("8", "Eight") recyclerViewData = recyclerViewData + RecyclerViewData("9", "Nine") recyclerViewData = recyclerViewData + RecyclerViewData("10", "Ten") recyclerViewData = recyclerViewData + RecyclerViewData("11", "Eleven") recyclerViewData = recyclerViewData + RecyclerViewData("12", "Twelve") recyclerViewData = recyclerViewData + RecyclerViewData("13", "Thirteen") recyclerViewData = recyclerViewData + RecyclerViewData("14", "Fourteen") recyclerViewData = recyclerViewData + RecyclerViewData("15", "Fifteen") // create a vertical layout manager val layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) // create instance of MyRecyclerViewAdapter val myRecyclerViewAdapter = MyRecyclerViewAdapter(recyclerViewData) // attach the adapter to the recycler view recyclerView.adapter = myRecyclerViewAdapter // also attach the layout manager recyclerView.layoutManager = layoutManager // make the adapter the data set // changed for the recycler view myRecyclerViewAdapter.notifyDataSetChanged() // now creating the scroll listener // for the recycler view recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) // if the recycler view is scrolled // above shrink the FAB if (dy > 10 && fab.isExtended) { fab.shrink() } // if the recycler view is scrolled // above extend the FAB if (dy < -10 && !fab.isExtended) { fab.extend() } // of the recycler view is at the first // item always extend the FAB if (!recyclerView.canScrollVertically(-1)) { fab.extend() } } }) } }
Producción:
Publicación traducida automáticamente
Artículo escrito por adityamshidlyali y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA