Ver enlaces con fragmentos en Android Jetpack

En el artículo anterior View Binding en Android Jetpack , se discutió por qué la adquisición de la función ViewBinding en el proyecto de Android brinda muchos beneficios. Pero cuando se trata de ViewBinding con fragmentos, el escenario cambia. Debido a que el ciclo de vida del Fragmento es diferente y el de la actividad es diferente Aquí también las cosas van igual como se discutió en el artículo anterior, las convenciones de nomenclatura del diseño del fragmento se cambian al caso pascal y las propiedades del diseño del fragmento al caso camel. Por ejemplo, fragment1.xml -> Fragment1Binding y edit_text (id) que está debajo del diseño del fragmento cambia a eEditText(caso del camello) Entonces, en este artículo, ViewBinding se analiza usando Fragmentos. A continuación se muestra un video de muestra para tener una idea de lo que vamos a hacer en este artículo. Tenga en cuenta que vamos a implementar este proyecto utilizando el  lenguaje Kotlin  . 

Implementación paso a paso

Paso 1: crear un nuevo proyecto de actividad vacío

Paso 2: habilite la función ViewBinding

  • Habilite la función ViewBinding invocando el siguiente fragmento de código dentro del archivo build.gradle del nivel de la aplicación y haga clic en los botones «Sincronizar ahora» que aparecen en la esquina superior derecha.

construir características {

       viewBinding = verdadero

}

  • Consulte la siguiente imagen si no puede ubicar el archivo build.gradle de nivel de aplicación que invoca la función de compilación anterior.

Paso 3: trabajar con el archivo activity_main.xml

  • El diseño principal de la actividad contiene dos botones, para alternar el fragmento 1 y el fragmento 2, y un Framelayout para contener los fragmentos dentro de CardView . Y un botón Enviar para verificar cuando se presiona de quién se envían los datos del fragmento.
  • Para implementar lo mismo, 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"
    tools:ignore="HardcodedText"
    tools:viewBindingIgnore="true">
  
    <Button
        android:id="@+id/fragment_1B"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="FRAGMENT 1"
        app:layout_constraintEnd_toStartOf="@+id/fragment_2B"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
  
    <Button
        android:id="@+id/fragment_2B"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="FRAGMENT 2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/fragment_1B"
        app:layout_constraintTop_toTopOf="parent" />
  
    <androidx.cardview.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="256dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/fragment_1B">
  
        <FrameLayout
            android:id="@+id/fragment_holder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginEnd="8dp" />
  
    </androidx.cardview.widget.CardView>
  
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:text="SUBMIT"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/card_view" />
  
</androidx.constraintlayout.widget.ConstraintLayout>

Interfaz de usuario de salida:

Paso 4: Creando dos fragmentos

  • Cree dos fragmentos, que incluyen una vista de texto para representar el texto de edición del número de fragmento y un botón. Para implementar la interfaz de usuario de cada fragmento, puede consultar los siguientes códigos.
  • Fragmento 1:

XML

<?xml version="1.0" encoding="utf-8"?>
<!--fragment 1-->
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ExampleFragment1"
    tools:ignore="HardcodedText">
  
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:text="Fragment 1"
        android:textSize="18sp" />
  
    <EditText
        android:id="@+id/edit_text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:hint="Enter Something" />
  
    <Button
        android:id="@+id/done_button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:text="DONE" />
  
</LinearLayout>
  • Fragmento 2:

XML

<?xml version="1.0" encoding="utf-8"?>
<!--fragment 2-->
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ExampleFragment2"
    tools:ignore="HardcodedText">
  
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:text="Fragment 2"
        android:textSize="18sp" />
  
    <EditText
        android:id="@+id/edit_text2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:hint="Enter Something" />
  
    <Button
        android:id="@+id/done_button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:text="DONE" />
  
</LinearLayout>

Paso 5: trabajar con los archivos Fragments.kt

  • En primer lugar, la variable vinculante que admite valores NULL se asigna a NULL inicialmente, y también cuando la vista del fragmento se destruye, nuevamente debe establecerse en NULL (que en este caso es _binding ).
  • Y para evitar la verificación nula del objeto de vinculación anulable, mediante el uso de la propiedad de respaldo de kotlin hacemos otra copia de la variable de vinculación (que en este caso es vinculante ).
  • Sin embargo, si el fragmento desea acceder a las vistas desde la actividad del host, puede hacerlo mediante el método findViewById() .
  • Invoque el siguiente código dentro de cada uno de los archivos .kt del fragmento. Se agregan comentarios para una mejor comprensión.
  • Fragmento 1:

Kotlin

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.Toast
import androidx.fragment.app.Fragment
  
// Enter your package name here
import com.adityamshidlyali.gfgarticle.databinding.Fragment1Binding
  
class ExampleFragment1 : Fragment() {
  
    // assign the _binding variable initially to null and
    // also when the view is destroyed again it has to be set to null
    private var _binding: Fragment1Binding? = null
  
    // with the backing property of the kotlin we extract
    // the non null value of the _binding
    private val binding get() = _binding!!
  
    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View {
  
        // inflate the layout and bind to the _binding
        _binding = Fragment1Binding.inflate(inflater, container, false)
  
        // retrieve the entered data by the user
        binding.doneButton1.setOnClickListener {
            val str: String = binding.editText1.text.toString()
            if (str.isNotEmpty()) {
                Toast.makeText(activity, str, Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(activity, "Please Enter Data", Toast.LENGTH_SHORT).show()
            }
        }
  
        // handle the button from the host activity using findViewById method
        val submitButton: Button = activity!!.findViewById(R.id.submit_button)
        submitButton.setOnClickListener {
            Toast.makeText(activity, "Host Activity Element Clicked from Fragment 1", Toast.LENGTH_SHORT).show()
        }
  
        // Inflate the layout for this fragment
        return binding.root
    }
  
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}
  • Fragmento 2:

Kotlin

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.Toast
import androidx.fragment.app.Fragment
  
// Enter your package name here
import com.adityamshidlyali.gfgarticle.databinding.Fragment2Binding
  
class ExampleFragment2 : Fragment() {
  
    // assign the _binding variable initially to null and
    // also when the view is destroyed again it has to be 
    // set to null
    private var _binding: Fragment2Binding? = null
  
    // with the backing property of the kotlin
    // we extract
    // the non null value of the _binding
    private val binding get() = _binding!!
  
    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View {
  
        // inflate the layout and bind to the _binding
        _binding = Fragment2Binding.inflate(inflater, container, false)
  
        // retrieve the entered data by the user
        binding.doneButton2.setOnClickListener {
            val str: String = binding.editText2.text.toString()
            if (str.isNotEmpty()) {
                Toast.makeText(activity, str, Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(activity, "Please Enter Data", Toast.LENGTH_SHORT).show()
            }
        }
  
        // handle the button from the host activity using findViewById method
        val submitButton: Button = activity!!.findViewById(R.id.submit_button)
        submitButton.setOnClickListener {
            Toast.makeText(activity, "Host Activity Element Clicked from Fragment 2", Toast.LENGTH_SHORT).show()
        }
  
        // Inflate the layout for this fragment
        return binding.root
    }
  
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

Paso 6: trabajar con el archivo MainActivity.kt

  • En el archivo MainActivity.kt solo se implementa la funcionalidad de transacción de los fragmentos. Consulte el siguiente código y su salida para una mejor comprensión.

Kotlin

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.fragment.app.Fragment
import com.adityamshidlyali.gfgarticle.databinding.ActivityMainBinding
  
class MainActivity : AppCompatActivity() {
  
    // create binding instance for the activity_main.xml
    private lateinit var binding: ActivityMainBinding
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
  
        // when app is initially opened the Fragment 1 should be visible
        supportFragmentManager.beginTransaction().apply {
            replace(binding.fragmentHolder.id, ExampleFragment1())
            addToBackStack(null)
            commit()
        }
  
        // handle the fragment 2 button to toggle the fragment 2
        binding.fragment1B.setOnClickListener {
            changeFragment(ExampleFragment1())
        }
  
        // handle the fragment 2 button to toggle the fragment 2
        binding.fragment2B.setOnClickListener {
            changeFragment(ExampleFragment1())
        }
    }
  
    // function to change the fragment which is used to reduce the lines of code
    private fun changeFragment(fragmentToChange: Fragment): Unit {
        supportFragmentManager.beginTransaction().apply {
            replace(binding.fragmentHolder.id, fragmentToChange)
            addToBackStack(null)
            commit()
        }
    }
}

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *