Middle
Wymień wszystkie sposoby przesyłania danych między fragmentami.
sobes.tech AI
Odpowiedź od AI
-
Argumenty Bundle: Najczęstszy sposób. Dane są przekazywane w formie Bundle za pomocą metody
setArguments()fragmentu.// W fragmencie nadawczym val bundle = Bundle() bundle.putString("key", "value") val targetFragment = TargetFragment() targetFragment.arguments = bundle // ... przejście do TargetFragment // W fragmencie odbiorczym override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... używamy value } -
Wspólny ViewModel: Używany do przekazywania danych związanych z cyklem życia aktywności lub kilku fragmentów.
// W ViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // W obu fragmentach private val sharedViewModel: SharedViewModel by activityViewModels() // W fragmencie nadawczym sharedViewModel.data.value = "dane do przekazania" // W fragmencie odbiorczym sharedViewModel.data.observe(viewLifecycleOwner) { data -> // ... używamy data } -
Interfejsy zwrotne: Fragment może zdefiniować interfejs, który implementuje aktywność. Fragment wywołuje metody tego interfejsu, przekazując dane do aktywności, która może je następnie przekazać innemu fragmentowi.
// Interfejs w fragmencie nadawczym interface OnDataPass { fun onDataPass(data: String) } // Fragment nadawczy private var dataPasser: OnDataPass? = null override fun onAttach(context: Context) { super.onAttach(context) if (context is OnDataPass) { dataPasser = context } else { throw RuntimeException("$context musi implementować OnDataPass") } } fun passData(data: String) { dataPasser?.onDataPass(data) } // Aktywność class MainActivity : AppCompatActivity(), OnDataPass { override fun onDataPass(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment targetFragment?.updateData(data) // Zakłada się, że TargetFragment ma metodę updateData } } // Fragment odbiorczy fun updateData(data: String) { // ... aktualizacja UI lub zapis danych } -
API Wyniku Fragmentu: Nowoczesny sposób przekazywania wyników między fragmentami, wprowadzony w AndroidX Fragment wersja 1.3.0.
// W fragmencie nadawczym setFragmentResult("requestKey", bundleOf("bundleKey" to "wynik")) // W fragmencie odbiorczym setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... używamy result }