Android 使用MVVM体系结构的活动共享元素转换
我正在学习MVVM模式,现在有一个问题。我有一个带有imageview的活动A,还有一个带有相同imageview的活动B,但在另一个地方和更大的地方。在活动A中,我单击imageview,我想启动活动B,imageview应该是共享元素,以实现我想要的动画效果 使用数据绑定我处理在我的视图模型中单击imageview:Android 使用MVVM体系结构的活动共享元素转换,android,android-transitions,shared-element-transition,android-mvvm,Android,Android Transitions,Shared Element Transition,Android Mvvm,我正在学习MVVM模式,现在有一个问题。我有一个带有imageview的活动A,还有一个带有相同imageview的活动B,但在另一个地方和更大的地方。在活动A中,我单击imageview,我想启动活动B,imageview应该是共享元素,以实现我想要的动画效果 使用数据绑定我处理在我的视图模型中单击imageview: <de.hdodenhof.circleimageview.CircleImageView android:layout_widt
<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" />
但是,问题是我的viewmodel对活动一无所知。我不知道该怎么做
一种可能的解决方案是使用startActivityB(视图视图)之类的方法创建接口,并在活动中实现它,并将其设置为字段,例如viewModelListener。然后我可以写下这样的东西:
public void onAvatarClick(View view) {
viewModelListener.startActivityB(view);
}
但在本例中,我的viewmodel将引用view,它打破了MVVM的主要思想,对吗
那么,使用MVVM体系结构使用共享元素启动新活动的正确方法是什么呢?这可以通过Android中的实时数据来完成。因为您可以观察实时数据中的更改,并相应地导航到其他活动 此处示例 在单击按钮的xml文件中
android:onClick="@{()->homeActivityViewModel.openNewActivity()}"
在viewModel类中
private final MutableLiveData<Boolean> openNewScreen = new MutableLiveData<>();
//function that is binded to xml
public void openNewActivity() {
openNewScreen.setValue(true);
}
public MutableLiveData<Boolean> getNewScreen() {
return openNewScreen;
}
private final MutableLiveData<Boolean> openNewScreen = new MutableLiveData<>();
//function that is binded to xml
public void openNewActivity() {
openNewScreen.setValue(true);
}
public MutableLiveData<Boolean> getNewScreen() {
return openNewScreen;
}
homeActivityViewModel.getNewScreen().observe(this,
start -> {
if (start) {
Intent intent = new Intent(this, NewActivity.class);
startActivity(intent);
} });