android - Location of click event in MVVM architecture
问题描述
I'm trying to use MVVM with databinding .. Where should I write click event (Viewmodel Or Activity)
Examples are welcome...
解决方案
您可以在其中任何一个上编写您的点击事件。就个人而言,我的偏好取决于我想要实现什么以及实现它需要什么。
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)}"/>
Activity 中的点击事件
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}"/>
有关更多信息,请查看此处的官方文档
推荐阅读
- swift - 正则表达式仅在字符串具有前缀时才执行某些操作
- r - R 函数用于从前几行中识别唯一行,而不是完全在数据框中
- django - Django-cors-headers 不适用于 Expo-web
- flutter - 在特定日期时间在后台运行 Flutter 代码
- django - Django没有将静态文件加载到资产文件中
- java - 打破多态性?
- python - 比较两个numpy数组后如何使用颜色图绘制散点数据点?
- spring - 从nestjs发送文件
- javascript - 启动 Shift + 旋转,将对象旋转 15° 步长(FabricJS)
- php - 根据请求验证路线 {prop}