在 MVVM 架构中从 ViewModel 添加片段

Add fragment from ViewModel in MVVM architecture

我正在使用 DataBinding 并遵循 MVVM 架构,现在我陷入了如何从 ViewModel 添加新片段的问题,因为我们需要定义点击事件在 ViewModel 上。这是我的MainViewModelclass

public class MainViewModel {
    private Context context;

    public MainViewModel (Context context) {
        this.context = context;
    }
    public void onClick(View v) {

    }
}

这是我的xml,我在这里定义了点击事件

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="viewmodel"
            type="com.example.MainViewModel" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
         <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{viewmodel::onClick}"
            android:text="click me"/>
    </RelativeLayout>
</layout>

现在如何从我的 ViewModel class 中获取 supportFragmentManagerchildFragmentManager?我尝试过使用 activity.getSupportFragmentManager()activity.getChildFragmentManager() 但它没有那种方法。

我知道我们可以用下面的代码添加片段

getActivity().getSupportFragmentManager().beginTransaction()
            .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, android.R.anim.fade_in, android.R.anim.fade_out).
            add(R.id.container, fragment, "").addToBackStack("main").commit();

但如何在 ViewModel class

我不知道是否可行,但这是我的建议:

定义一个接口,让Activity或者Fragment实现这个接口

public interface FragmentProvider {
    void showFragment(...);
}

将 FragmentProvider 的实例传递到您的 ViewModel

public class MainViewModel {
    private Context context;
    private FragmentProvider provider;

    public MainViewModel (FragmentProvider provider) {
        this.provider = provider;
   }

   public void onClick(View v) {
        // delegate the action
        provider.showFragment(...);
   }

}

由于您的 Context 可用,您有两种可能性:

public class MainViewModel {
    private Context context;

    public MainViewModel (Context context) {
        this.context = context;
    }

    public void onClick(View v) {
        //use context:
        ((AppCompatActivity) context).getSupportFragmentManager();

        //OR use the views context:
        if(v.getContext() instanceof AppCompatActivity) {
            ((AppCompatActivity) v.getContext()).getSupportFragmentManager();
        }            
    }    
}

在调用之前检查上下文是否是您的 activity(如 MainActivity)或 AppCompatActivity 的实例或者它是否是 null 可能很有用任何方法。