Activity 使用 MVVM 架构的共享元素转换
Activity shared element transition using MVVM architecture
我正在学习 MVVM 模式,但现在遇到了一个问题。我有一个 activity A 上面有 imageview,还有一个 activity B 有相同的 imageview 但在另一个地方更大。当在 activity A 中单击 imageview 时,我想启动 activity B 和 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());
}
但是,问题是我的视图模型对 activity 一无所知。而且我不知道如何做我想做的事。
一种可能的解决方案是使用类似 startActivityB(View view) 的方法创建接口并在 activity 中实现它,并将其设置为字段,例如 viewModelListener。然后我可以这样写:
public void onAvatarClick(View view) {
viewModelListener.startActivityB(view);
}
但在这种情况下,我的视图模型将引用视图,这打破了 MVVM 的主要思想,对吧?
那么,使用 MVVM 架构以共享元素开始新 activity 的正确方法是什么?
这可以通过 Android 中的实时数据来完成。正如您可以观察实时数据的变化并相应地导航到其他 activity。
示例在这里
在您的 xml 文件中单击按钮
android:onClick="@{()->homeActivityViewModel.openNewActivity()}"
在你的视图模型中class
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;
}
在你的activity
homeActivityViewModel.getNewScreen().observe(this,
start -> {
if (start) {
Intent intent = new Intent(this, NewActivity.class);
startActivity(intent);
} });
我正在学习 MVVM 模式,但现在遇到了一个问题。我有一个 activity A 上面有 imageview,还有一个 activity B 有相同的 imageview 但在另一个地方更大。当在 activity A 中单击 imageview 时,我想启动 activity B 和 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());
}
但是,问题是我的视图模型对 activity 一无所知。而且我不知道如何做我想做的事。
一种可能的解决方案是使用类似 startActivityB(View view) 的方法创建接口并在 activity 中实现它,并将其设置为字段,例如 viewModelListener。然后我可以这样写:
public void onAvatarClick(View view) {
viewModelListener.startActivityB(view);
}
但在这种情况下,我的视图模型将引用视图,这打破了 MVVM 的主要思想,对吧?
那么,使用 MVVM 架构以共享元素开始新 activity 的正确方法是什么?
这可以通过 Android 中的实时数据来完成。正如您可以观察实时数据的变化并相应地导航到其他 activity。
示例在这里
在您的 xml 文件中单击按钮
android:onClick="@{()->homeActivityViewModel.openNewActivity()}"
在你的视图模型中class
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;
}
在你的activity
homeActivityViewModel.getNewScreen().observe(this,
start -> {
if (start) {
Intent intent = new Intent(this, NewActivity.class);
startActivity(intent);
} });