Middle
Избройте всички начини за прехвърляне на данни между фрагменти.
sobes.tech AI
Отговор от AI
-
Аргументи на Bundle: Най-често срещаният начин. Данните се предават като Bundle чрез метода
setArguments()на фрагмента.// В изходния фрагмент val bundle = Bundle() bundle.putString("key", "value") val targetFragment = TargetFragment() targetFragment.arguments = bundle // ... преминаване към TargetFragment // В приемащия фрагмент override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val value = arguments?.getString("key") // ... използваме стойността } -
Shared ViewModel: Използва се за предаване на данни, свързани с жизнения цикъл на активността или няколко фрагмента.
// В ViewModel class SharedViewModel : ViewModel() { val data = MutableLiveData<String>() } // В двата фрагмента private val sharedViewModel: SharedViewModel by activityViewModels() // В изходния фрагмент sharedViewModel.data.value = "предавани данни" // В приемащия фрагмент sharedViewModel.data.observe(viewLifecycleOwner) { data -> // ... използваме данните } -
Интерфейси за обратно повикване: Фрагмент може да дефинира интерфейс, който активността реализира. Фрагментът извиква методите на този интерфейс, предавайки данни на активността, която след това може да ги предаде на друг фрагмент.
// Интерфейс във изходния фрагмент interface OnDataPass { fun onDataPass(data: String) } // Изходен фрагмент private var dataPasser: OnDataPass? = null override fun onAttach(context: Context) { super.onAttach(context) if (context is OnDataPass) { dataPasser = context } else { throw RuntimeException("$context трябва да реализира OnDataPass") } } fun passData(data: String) { dataPasser?.onDataPass(data) } // Активност class MainActivity : AppCompatActivity(), OnDataPass { override fun onDataPass(data: String) { val targetFragment = supportFragmentManager.findFragmentById(R.id.target_fragment) as? TargetFragment targetFragment?.updateData(data) // Предполага се метод updateData в TargetFragment } } // Приемащ фрагмент fun updateData(data: String) { // ... актуализиране на UI или запазване на данни } -
Fragment Result API: Модерен начин за предаване на резултати между фрагменти, представен във версия 1.3.0 на AndroidX Fragment.
// В изходния фрагмент setFragmentResult("requestKey", bundleOf("bundleKey" to "резултат")) // В приемащия фрагмент setFragmentResultListener("requestKey") { requestKey, bundle -> val result = bundle.getString("bundleKey") // ... използваме резултата }