Now today, LiveData is very popular, How can i send data from activity to fragment using ViewModel and LiveData or vice-versa ? Please explain with coding example.
In android, we can use ViewModel to share data between various fragments or activities by sharing the same ViewModel among all the fragments and they can access everything defined in the ViewModel. This is one way to have communication between fragments or activities.
In Activity
public class MyActivity extends AppCompatActivity {
MyViewModel myViewModel;
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
handler = new Handler();
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, MyFragment.newInstance())
.commitNow();
}
//Make View Holder Object
myViewModel=ViewModelProviders.of(this).get(MyViewModel.class);
myViewModel.init();
myViewModel.sendData("Hello kamy");
// Make thread to send data again
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
@Override
public void run() {
myViewModel.sendData("How are You ?");
}
});
}
}).start();
}
}
In ViewModel Class
public class MyViewModel extends ViewModel {
// TODO: Implement the ViewModel
private MutableLiveData<String> stringMutableLiveData;
public void init()
{
stringMutableLiveData=new MutableLiveData<>();
}
public void sendData(String msg)
{
stringMutableLiveData.setValue(msg);
}
public LiveData<String> getMessage()
{
return stringMutableLiveData;
}
}
In Fragment
public class MyFragment extends Fragment {
private MyViewModel mViewModel;
private TextView textView;
public static MyFragment newInstance() {
return new MyFragment();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.my_fragment, container, false);
textView=(TextView)view.findViewById(R.id.message);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
ViewModelProviders.of(getActivity()).get(MyViewModel.class).getMessage().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String message) {
textView.setText(message);
Toast.makeText(getContext(),message,Toast.LENGTH_SHORT).show();
}
});
}
}
fragment xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/my"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.my.MyFragment">
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="MyFragment"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With