【问题标题】:Activity shared element transition using MVVM architecture使用 MVVM 架构的活动共享元素转换
【发布时间】:2018-08-06 14:33:04
【问题描述】:

我正在学习 MVVM 模式,但现在遇到了问题。我有一个带有 imageview 的活动 A,还有一个带有相同 imageview 但在另一个地方更大的活动 B。在活动 A 中单击 imageview 时,我想启动活动 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());
}

但是,问题是我的视图模型对活动一无所知。而且我不知道该怎么做。

一种可能的解决方案是使用 startActivityB(View view) 之类的方法创建接口并在活动中实现它并将其设置为字段,例如 viewModelListener。然后我可以写类似的东西:

public void onAvatarClick(View view) {
    viewModelListener.startActivityB(view);
}

但在这种情况下,我的视图模型将引用视图,它打破了 MVVM 的主要思想,对吧?

那么,使用 MVVM 架构通过共享元素开始新活动的正确方法是什么?

【问题讨论】:

    标签: android android-transitions shared-element-transition android-mvvm


    【解决方案1】:

    这可以通过 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;
    }
    

    在你的活动中

     homeActivityViewModel.getNewScreen().observe(this,
                start -> {
                    if (start) {
                        Intent intent = new Intent(this, NewActivity.class);
                        startActivity(intent);
                    } });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多