Middle
Como garantir o acesso aos objetos a partir do componente pai na Activity?
sobes.tech IA
Resposta da IA
No Android, a acessibilidade a objetos a partir de um componente pai (por exemplo, um fragmento ou vista) numa Activity é fornecida através de referências a esses objetos, passadas ou obtidas de várias formas.
Formas principais:
- Obtenção direta da referência através de métodos da Activity:
findViewById()para vistas.findFragmentById()oufindFragmentByTag()para fragmentos.- Referências a gestores (por exemplo,
getSupportFragmentManager(),getSystemService()).
- Passagem de referência na criação: O objeto pai pode passar uma referência a si próprio ou aos seus componentes filhos ao criá-los (por exemplo, através do construtor, método de fábrica ou argumentos).
- Interfaces de callback (padrão Listener): O componente filho chama métodos de uma interface predefinida, que a Activity implementa. A Activity subscreve-se a esses chamados.
- Ligação de dados (Data Binding): Permite ligar dados e lógica de visualização com a Activity/fragmento, fornecendo acesso aos elementos do layout.
- ViewModel (componente arquitetónico): O ViewModel pode conter dados ou referências acessíveis tanto para a Activity como para os componentes relacionados.
Exemplo com findViewById():
// Na Activity
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my)
val myView = findViewById<TextView>(R.id.myTextView) // Obtenção de referência à vista na Activity
myView.text = "Disponível na Activity"
}
}
Exemplo com interface de callback:
// Interface para interação
interface MyCallbacks {
fun onSomethingHappen(data: String)
}
// Fragmento que chama o callback
class MyFragment : Fragment() {
private var callbacks: MyCallbacks? = null
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is MyCallbacks) {
callbacks = context // A Activity implementa a interface e torna-se callback
}
}
fun doSomething() {
val result = "Alguns dados do fragmento"
callbacks?.onSomethingHappen(result) // Chamada do método da Activity
}
}
// Activity que implementa a interface
class MyActivity : AppCompatActivity(), MyCallbacks {
override fun onSomethingHappen(data: String) {
// Dados recebidos do fragmento
Log.d("MyActivity", "Dados recebidos do fragmento: $data")
}
}