Sobes.tech
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() ou findFragmentByTag() 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")
    }
}