web-dev-qa-db-fra.com

Emplacement de l'événement de clic dans l'architecture MVVM

J'essaie d'utiliser MVVM avec la liaison de données .. Où dois-je écrire l'événement click (Viewmodel Or Activity)

Les exemples sont les bienvenus ...

9
Anshul gour

Vous pouvez écrire vos événements de clic sur l'un ou l'autre. Personnellement, ma préférence dépend de ce que je veux réaliser et de ce dont j'ai besoin pour y parvenir.

Cliquez sur l'événement dans ViewModel

Définissez votre ViewModel. Communiquez avec votre activité via un rappel.

public class MyViewModel extends ViewModel{

    private MyCustomCallback callback;
    ...
    public void doOnClick(MyCustomCallback mCallback){
        boolean isSuccessful = doMyAction.execute();
        if (isSuccessful){
            mCallback.actionIsSuccessful();
        } else {
            mCallback.actionFailed();
        }
    }
    ...
    public void setCallback(callback){
        this.callback = callback;   
    }
    public MyCustomCallback getCallback(){
        return this.callback;   
    }
    ...

    public interface MyCustomCallback{
        void actionIsSuccessful();
        void actionFailed();
    }
}

Implémentez ce rappel dans votre activité:

public class MyActivity extends AppCompatActivity{
    ...
    private MyCustomCallback callback;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        ...
        callback = new MyViewModel.MyCustomCallback{
            @Override
            public void actionIsSuccessful(){
                //do something when action is successful
            }
            @Override
            public void actionFailed(){
                //do something when action fails
            }
        }
        viewModel.setCallback(callback);
    }
}

Passez votre ViewModel en tant que variable à votre XML. Ensuite, faites ceci:

<Button
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@drawable/button_background"
    Android:layout_margin="20dp"
    tools:text="CLICK ME!!!"
    Android:textColor="@Android:color/white"
    Android:onClick="@{() -> ViewModel.doOnClick(ViewModel.callback)}"/>

Cliquez sur les événements dans l'activité

public class MyActivity extends AppCompatActivity{
    ...
    private MyCustomCallback callback;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        //initialize your binding
        ...
        binding.setClickHandler(new MyActivityClickHandler());
    }

    public class MyActivityClickHandler{
        public void onClickMeClicked(View view){
            //do something
        }
    }
}

Puis dans votre XML:

<Button
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@drawable/button_background"
    Android:layout_margin="20dp"
    Android:text="@string/verify"
    Android:textColor="@Android:color/white"
    Android:onClick="@{ClickHandler::onClickMeClicked}"/>

Pour plus d'informations, consultez le document officiel ici

3
Ayokunle Paul