Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用MVVM体系结构的活动共享元素转换_Android_Android Transitions_Shared Element Transition_Android Mvvm - Fatal编程技术网

Android 使用MVVM体系结构的活动共享元素转换

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

我正在学习MVVM模式,现在有一个问题。我有一个带有imageview的活动A,还有一个带有相同imageview的活动B,但在另一个地方和更大的地方。在活动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" />
但是,问题是我的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);
                } });