Middle
Jak zajistit přístup k objektům ze rodičovské komponenty v Activity?
sobes.tech AI
Odpověď od AI
V Androidu je přístupnost objektů z rodičovské komponenty (například fragmentu nebo zobrazení) v aktivitě zajištěna prostřednictvím odkazů na tyto objekty, které jsou předávány nebo získávány různými způsoby.
Hlavní způsoby:
- Přímé získání odkazu pomocí metod aktivity:
findViewById()pro zobrazení.findFragmentById()nebofindFragmentByTag()pro fragmenty.- Odkazy na správce (například
getSupportFragmentManager(),getSystemService()).
- Předání odkazu při vytváření: Rodičovský objekt může předat odkaz na sebe nebo své podřízené komponenty při jejich vytváření (například přes konstruktor, tovární metodu nebo argumenty).
- Callback rozhraní (vzorek Listener): Podřízená komponenta volá předem definované metody rozhraní, které implementuje aktivita. Aktivita se na tyto volání přihlašuje.
- Vazba dat (Data Binding): Umožňuje propojení dat a logiky zobrazení s aktivitou/fragmentem, poskytující přístup k prvkům rozvržení.
- ViewModel (architektonická komponenta): ViewModel může obsahovat data nebo odkazy dostupné jak pro aktivitu, tak pro s ní spojené komponenty.
Příklad s findViewById():
// V aktivitě
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my)
val myView = findViewById<TextView>(R.id.myTextView) // Odkaz na zobrazení v aktivitě
myView.text = "Dostupné z aktivity"
}
}
Příklad s callback rozhraním:
// Rozhraní pro interakci
interface MyCallbacks {
fun onSomethingHappen(data: String)
}
// Fragment, který volá callback
class MyFragment : Fragment() {
private var callbacks: MyCallbacks? = null
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is MyCallbacks) {
callbacks = context // Aktivita implementuje rozhraní a stává se callbackem
}
}
fun doSomething() {
val result = "Některá data z fragmentu"
callbacks?.onSomethingHappen(result) // Volání metody aktivity
}
}
// Aktivita, která implementuje rozhraní
class MyActivity : AppCompatActivity(), MyCallbacks {
override fun onSomethingHappen(data: String) {
// Přijatá data z fragmentu
Log.d("MyActivity", "Přijatá data z fragmentu: $data")
}
}