データバインディングでMVVMを使用しようとしています。クリックイベント(ビューモデルまたはアクティビティ)はどこに記述すればよいですか。
例は大歓迎です...
クリックイベントはどちらでも記述できます。個人的に、私の好みは、達成したいことと達成する必要があることに依存します。
ViewModelのクリックイベント
ViewModelを定義します。コールバックを介してアクティビティと通信します。
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();
}
}
このコールバックをアクティビティに実装します。
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);
}
}
ViewModelを変数としてXMLに渡します。次にこれを行います:
<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)}"/>
アクティビティのイベントをクリック
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
}
}
}
次に、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}"/>
詳細については、公式ドキュメント ここ を確認してください