Middle
Uveďte všechny způsoby přenosu dat mezi fragmenty.
sobes.tech AI
Odpověď od AI
-
Balíček argumenty: Nejčastejší způsob. Data jsou předávána ve formě Bundle přes metodu
setArguments()fragmentu.// Ve vysílajícím fragmentu val bundle = Bundle() bundle.putString("key", "value") val targetFragment = TargetFragment() targetFragment.arguments = bundle // ... přechod na TargetFragment // Ve přijímajícím fragmentu override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... používáme hodnotu } -
Sdílený ViewModel: Používá se pro předávání dat souvisejících s životním cyklem aktivity nebo více fragmentů.
// V ViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // V obou fragmentech private val sharedViewModel: SharedViewModel by activityViewModels() // Ve vysílajícím fragmentu sharedViewModel.data.value = "předávaná data" // Ve přijímajícím fragmentu sharedViewModel.data.observe(viewLifecycleOwner) { data -> // ... používáme data } -
Callback rozhraní: Fragment může definovat rozhraní, které implementuje aktivita. Fragment volá metody tohoto rozhraní a předává data aktivitě, která je pak může předat jinému fragmentu.
// Rozhraní ve vysílajícím fragmentu interface OnDataPass { fun onDataPass(data: String) } // Vysílající fragment private var dataPasser: OnDataPass? = null override fun onAttach(context: Context) { super.onAttach(context) if (context is OnDataPass) { dataPasser = context } else { throw RuntimeException("$context musí implementovat OnDataPass") } } fun passData(data: String) { dataPasser?.onDataPass(data) } // Aktivita class MainActivity : AppCompatActivity(), OnDataPass { override fun onDataPass(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment targetFragment?.updateData(data) // Předpokládá se metoda updateData v TargetFragment } } // Přijímající fragment fun updateData(data: String) { // ... aktualizujeme UI nebo ukládáme data } -
Fragment Result API: Moderní způsob předávání výsledků mezi fragmenty, představený v AndroidX Fragment verze 1.3.0.
// Ve vysílajícím fragmentu setFragmentResult("requestKey", bundleOf("bundleKey" to "výsledek")) // Ve přijímajícím fragmentu setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... používáme výsledek }