Sobes.tech
Middle

Kuidas tagada juurdepääs objektidele vanemkomponendist Activity's?

sobes.tech AI

Vastus AI-lt

Androidis on objektide kättesaadavus vanemkomponendist (näiteks fragment või vaade) tagatud nende viidetega, mis on edastatud või saadud erinevatel viisidel.

Põhiviisid:

  • Otseviide kaudu Activity meetodite abil:
    • findViewById() vaadete jaoks.
    • findFragmentById() või findFragmentByTag() fragmentide jaoks.
    • Viited halduritele (näiteks, getSupportFragmentManager(), getSystemService()).
  • Viide edastamine loomise ajal: Vanemobjekt võib edastada viite iseendale või oma komponentidele lapsele nende loomisel (näiteks, konstruktoriga, tehase meetodiga või argumentidega).
  • Callback-liidesed (Listener muster): Lapsekomponent kutsub välja eelnevalt määratletud liidese meetodid, mida realiseerib Activity. Activity registreerub nende väljakutsete jaoks.
  • Andmete sidumine (Data Binding): Võimaldab siduda andmeid ja vaate loogikat Activity/fragmentiga, võimaldades juurdepääsu paigutuse elementidele.
  • ViewModel (arhitektuurikomponent): ViewModel võib sisaldada andmeid või viiteid, mis on kättesaadavad nii Activity-le kui ka sellega seotud komponentidele.

Näide findViewById()-ga:

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

        val myView = findViewById<TextView>(R.id.myTextView) // Viide vaatele Activity-s
        myView.text = "Juurdepääsetav Activity-st"
    }
}

Näide Callback-liidesega:

// Interaktiivse liidese
interface MyCallbacks {
    fun onSomethingHappen(data: String)
}

// Fragment, mis kutsub callbacki
class MyFragment : Fragment() {
    private var callbacks: MyCallbacks? = null

    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is MyCallbacks) {
            callbacks = context // Activity realiseerib liidese ja saab callbackiks
        }
    }

    fun doSomething() {
        val result = "Mõned andmed fragmentist"
        callbacks?.onSomethingHappen(result) // Kutsub Activity meetodi
    }
}

// Activity, mis realiseerib liidese
class MyActivity : AppCompatActivity(), MyCallbacks {
    override fun onSomethingHappen(data: String) {
        // Saadud andmed fragmentist
        Log.d("MyActivity", "Saadud andmed fragmentist: $data")
    }
}