Skip to main content

How to communicate between fragments in Kotlin Android

How to communicate between fragments in Kotlin Android.

In Android development, fragments are reusable components that represent a portion of the user interface (UI) in an activity. Sometimes, fragments need to communicate with each other to share data or trigger actions. In this tutorial, we will explore different approaches to communicate between fragments in Kotlin Android.

Method 1: Using Interfaces

One common way to communicate between fragments is by using interfaces. This involves creating an interface in the fragment that wants to send data and implementing it in the parent activity. The other fragment can then access the implemented interface through the parent activity and receive the data.

Here's how you can implement this approach:

  1. Create an interface in the fragment that wants to send data. For example, let's call it DataListener:
interface DataListener {
fun onDataReceived(data: String)
}
  1. In the fragment that needs to send data, declare a variable of type DataListener and initialize it to null:
private var dataListener: DataListener? = null
  1. Implement a method to set the data listener in the fragment:
fun setDataListener(listener: DataListener) {
dataListener = listener
}
  1. When you want to send data from the fragment, check if dataListener is not null and call the onDataReceived method:
dataListener?.onDataReceived(data)
  1. In the parent activity, implement the DataListener interface:
class MainActivity : AppCompatActivity(), DataListener {
// ...
override fun onDataReceived(data: String) {
// Handle the received data
}
}
  1. In the parent activity's onCreate method, set the data listener for the fragment that needs to send data:
val fragment = MyFragment()
fragment.setDataListener(this)

By following these steps, you have established communication between two fragments using interfaces.

Method 2: Using ViewModel

Another approach to communicate between fragments is by using a shared ViewModel. The ViewModel can hold the shared data and both fragments can access and modify it.

Here's how you can implement this approach:

  1. Create a ViewModel class that extends ViewModel:
class SharedViewModel : ViewModel() {
val sharedData = MutableLiveData<String>()
}
  1. In each fragment that needs to access the shared data, create an instance of the ViewModel:
private val sharedViewModel: SharedViewModel by activityViewModels()
  1. To access the shared data, observe the sharedData LiveData in each fragment:
sharedViewModel.sharedData.observe(viewLifecycleOwner) { data ->
// Handle the received data
}
  1. To send data from one fragment to another, update the value of sharedData in the ViewModel:
sharedViewModel.sharedData.value = data

By following these steps, both fragments can communicate and share data through the shared ViewModel.

Method 3: Using Bundle Arguments

If you only need to pass data when navigating between fragments, you can use bundle arguments. This approach is useful when the data needs to be passed during fragment creation.

Here's how you can implement this approach:

  1. In the fragment that needs to receive data, declare a companion object with a factory method to create an instance of the fragment with arguments:
class MyFragment : Fragment() {
companion object {
fun newInstance(data: String): MyFragment {
val fragment = MyFragment()
val bundle = Bundle().apply {
putString("data", data)
}
fragment.arguments = bundle
return fragment
}
}
}
  1. In the fragment that wants to send data, create an instance of the fragment using the factory method and pass the data as an argument:
val fragment = MyFragment.newInstance(data)
  1. In the receiving fragment's onCreateView method, retrieve the data from arguments:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val data = arguments?.getString("data")
// Handle the received data
return inflater.inflate(R.layout.fragment_my, container, false)
}

By following these steps, you can pass data between fragments using bundle arguments.

Conclusion

In this tutorial, we explored three different approaches to communicate between fragments in Kotlin Android. You can choose the appropriate method based on your requirements. Using interfaces, a shared ViewModel, or bundle arguments allows fragments to communicate and share data effectively.