我正在学习MVVM模式,现在有一个问题。我有一个活动A,上面有ImageView,还有一个活动B,上面有相同的ImageView,但是在另一个地方和更大的地方。在活动A中,我单击ImageView时,我想启动活动B,并且ImageView应该是共享元素,以通过良好的动画实现我想要的。
使用我处理的数据绑定,在我的视图模型中单击ImageView:
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:onClick="@{(v) -> user.onAvatarClick(v)}"
android:scaleType="centerCrop"
android:src="@{user.photoUrl}"
android:transitionName="@string/avatar_transition" />
在我的视图模型中,我应该这样写:
public void onAvatarClick(View view) {
Intent intent = new Intent(context, AvatarActivity.class);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, view, view.getTransitionName());
context.startActivity(intent, options.toBundle());
}
但是,问题是我的视图模型对活动一无所知。我不知道该怎么做。
一种可能的解决方案是使用StartActivityB(视图视图)等方法创建接口,并在Activity中实现它,并将其设置为Field,例如ViewModelListener。然后我可以写下:
public void onAvatarClick(View view) {
viewModelListener.startActivityB(view);
}
但在这种情况下,我的视图模型将引用视图,它打破了MVVM的主要思想,对吧?
那么,使用MVVM体系结构的共享元素启动新活动的正确方法是什么?