4

我正在使用DataBinding并遵循MVVM 架构,现在我被困在如何添加新片段,ViewModel因为我们需要定义点击事件ViewModel。这是我的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>

现在我怎样才能得到supportFragmentManagerchildFragmentManager从我的 ViewModel 类?我试过用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课堂上做到这一点

4

2 回答 2

4

既然你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在调用任何方法之前可能很有用。

于 2016-10-18T06:29:41.523 回答
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(...);
   }

}

于 2016-10-17T12:48:36.413 回答