Sobes.tech
Middle

Чӣ тавр дастрасӣ ба объектҳо аз компонентҳои падар дар Activity таъмин кардан мумкин аст?

sobes.tech AI

Ҷавоб аз AI

В Android, дастрасии объектҳо аз компонентҳои падар (масалан, фрагмент ё намоиш) дар Activity тавассути истинодҳо ба ин объектҳо, ки тавассути роҳҳои гуногун супорида ё гирифта шудаанд, таъмин карда мешавад.

Роҳҳои асосӣ:

  • Гиредории мустақим тавассути методҳои Activity:
    • findViewById() барои намоишҳо.
    • findFragmentById() ё findFragmentByTag() барои фрагментҳо.
    • Истинодҳо ба мудирон (масалан, getSupportFragmentManager(), getSystemService()).
  • Пас додани истинод ҳангоми эҷод: Объекти падар метавонад истинод ба худ ё ба компонентҳои худро ҳангоми эҷод ба объекти кӯдак супорад (масалан, тавассути конструктор, усули фабрика ё аргументҳо).
  • Интерфейсҳои Callback (паттерн Listener): Компоненти кӯдаки занг мезанад ба методҳои интерфейси пешакӣ муайяншуда, ки Activity иҷро мекунад. Activity ба ин зангҳо обуна мешавад.
  • Васлкунии маълумот (Data Binding): Имкон медиҳад, ки маълумот ва логикаи намоиш бо Activity/фрагмент пайваст карда шаванд, бо дастрасӣ ба унсурҳои макет.
  • ViewModel (компоненти меъморӣ): ViewModel метавонад маълумот ё истинодҳоро дар бар гирад, ки ҳам барои Activity ва ҳам барои компонентҳои пайвастшуда дастрасанд.

Масал бо findViewById():

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

        val myView = findViewById<TextView>(R.id.myTextView) // Гирифтани истинод ба намоиш дар Activity
        myView.text = "Дастрас аз Activity"
    }
}

Масал бо интерфейси Callback:

// Интерфейс барои муошират
interface MyCallbacks {
    fun onSomethingHappen(data: String)
}

// Фрагмент, ки занг мезанад ба callback
class MyFragment : Fragment() {
    private var callbacks: MyCallbacks? = null

    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is MyCallbacks) {
            callbacks = context // Activity интерфейсиро иҷро мекунад ва callback мешавад
        }
    }

    fun doSomething() {
        val result = "Маълумоти баъзе аз фрагмент"
        callbacks?.onSomethingHappen(result) // Занг ба методи Activity
    }
}

// Activity, ки интерфейсиро иҷро мекунад
class MyActivity : AppCompatActivity(), MyCallbacks {
    override fun onSomethingHappen(data: String) {
        // Маълумоти гирифташуда аз фрагмент
        Log.d("MyActivity", "Маълумоти гирифташуда аз фрагмент: $data")
    }
}