繁体   English   中英

在MVVM架构中从ViewModel添加片段

[英]Add fragment from ViewModel in MVVM architecture

我正在使用DataBinding并遵循MVVM体系结构 ,现在我被困在如何从ViewModel添加新片段上,因为我们需要在ViewModel上定义click事件。 这是我的MainViewModel

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类中获取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类中做到这一点

由于您有可用的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();
        }            
    }    
}

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

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

定义一个接口,并让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(...);
   }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM