One way to exchange data or events between fragments in Android Studio is to use `ViewModel`. You will need `ViewModel` together with `ViewModelProvider` and a shared `ViewModel` for your activity.
First, create a `SharedViewModel`:
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class SharedViewModel : ViewModel() {
private val _someLiveData = MutableLiveData<String>()
val someLiveData: LiveData<String> get() = _someLiveData
fun updateData(data: String) {
_someLiveData.value = data
}
}In `MainActivity`, create an instance of `SharedViewModel`:
class MainActivity : AppCompatActivity() {
private lateinit var sharedViewModel: SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
// Остальной код...
sharedViewModel = ViewModelProvider(this).get(SharedViewModel::class.java)
}
// Остальной код...
}Now, in `GenFragment`, retrieve an instance of `SharedViewModel` and update the data in `onCreateView` or elsewhere:
class GenFragment : Fragment() {
private lateinit var sharedViewModel: SharedViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
sharedViewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
// Получите данные из SharedViewModel и выполните необходимые действия
val someData = sharedViewModel.someLiveData.observe(viewLifecycleOwner, Observer {
// Обновите контекст фрагмента
updateFragmentContext()
})
// Остальной код...
return inflater.inflate(R.layout.fragment_gen, container, false)
}
private fun updateFragmentContext() {
// Реализуйте ваш метод обновления контекста здесь
}
// Остальной код...
}Then, in your `onOptionsItemSelected` method, update the data in `SharedViewModel`:
R.id.action_clear -> {
sharedViewModel.updateData("your_data_here")
val str = getString(R.string.cleared_toast)
Toast.makeText(this, str, Toast.LENGTH_SHORT).show()
return true
}Replace your_data_here with the actual data you want to pass to `GenFragment`.