Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can i send data from Activity to Fragment using LiveData and ViewModel class

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.

like image 450
kamydeep Avatar asked Sep 22 '18 16:09

kamydeep


People also ask

Can a ViewModel be shared between activity and fragment?

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.


1 Answers

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>
like image 168
Kamal Kakkar Avatar answered Oct 17 '22 06:10

Kamal Kakkar