Sobes.tech
Middle

Comment assurer l'accès aux objets depuis le composant parent dans Activity?

sobes.tech IA

Réponse de l'IA

Sur Android, l'accessibilité aux objets depuis un composant parent (par exemple, un fragment ou une vue) dans une Activity est assurée par des références à ces objets, transmises ou obtenues de différentes manières.

Principales méthodes :

  • Obtention directe de la référence via les méthodes de l'Activity :
    • findViewById() pour les vues.
    • findFragmentById() ou findFragmentByTag() pour les fragments.
    • Références aux gestionnaires (par exemple, getSupportFragmentManager(), getSystemService()).
  • Transmission de la référence lors de la création : L'objet parent peut transmettre une référence à lui-même ou à ses composants enfants lors de leur création (par exemple, via le constructeur, une méthode de fabrique ou des arguments).
  • Interfaces de rappel (patron Listener) : Le composant enfant appelle des méthodes d'une interface prédéfinie, que l'Activity implémente. L'Activity s'abonne à ces appels.
  • Binding de données (Data Binding) : Permet de lier des données et la logique de vue à l'Activity/fragment, en fournissant l'accès aux éléments du layout.
  • ViewModel (composant architectural) : Le ViewModel peut contenir des données ou des références accessibles à la fois par l'Activity et par ses composants liés.

Exemple avec findViewById() :

// Dans l'Activity
class MyActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my)

        val myView = findViewById<TextView>(R.id.myTextView) // Obtention de la référence à la vue dans l'Activity
        myView.text = "Accessible depuis l'Activity"
    }
}

Exemple avec interface de rappel :

// Interface pour l'interaction
interface MyCallbacks {
    fun onSomethingHappen(data: String)
}

// Fragment qui appelle le callback
class MyFragment : Fragment() {
    private var callbacks: MyCallbacks? = null

    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is MyCallbacks) {
            callbacks = context // L'Activity implémente l'interface et devient le callback
        }
    }

    fun doSomething() {
        val result = "Certaines données du fragment"
        callbacks?.onSomethingHappen(result) // Appel de la méthode de l'Activity
    }
}

// Activity qui implémente l'interface
class MyActivity : AppCompatActivity(), MyCallbacks {
    override fun onSomethingHappen(data: String) {
        // Données reçues du fragment
        Log.d("MyActivity", "Données reçues du fragment : $data")
    }
}