在MVVM体系结构中从ViewModel添加片段

时间:2016-10-17 12:36:51

标签: android android-fragments mvvm android-databinding android-mvvm

我正在使用DataBinding并关注 MVVM架构,现在我被困在如何从ViewModel添加新片段,因为我们需要在{{1}上定义点击事件}。这是我的ViewModel课程

MainViewModel

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

public class MainViewModel {
    private Context context;

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

    }
}

现在如何从我的ViewModel类中获取<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> supportFragmentManager?我曾尝试使用childFragmentManageractivity.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();

中执行此操作

2 个答案:

答案 0 :(得分:3)

由于您有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可能很有用。

答案 1 :(得分:0)

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

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

}