在 MVVM 架构中从 ViewModel 添加片段
Add fragment from ViewModel in MVVM architecture
我正在使用 DataBinding
并遵循 MVVM 架构,现在我陷入了如何从 ViewModel
添加新片段的问题,因为我们需要定义点击事件在 ViewModel
上。这是我的MainViewModel
class
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 中获取 supportFragmentManager
或 childFragmentManager
?我尝试过使用 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
可能很有用任何方法。
我正在使用 DataBinding
并遵循 MVVM 架构,现在我陷入了如何从 ViewModel
添加新片段的问题,因为我们需要定义点击事件在 ViewModel
上。这是我的MainViewModel
class
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 中获取 supportFragmentManager
或 childFragmentManager
?我尝试过使用 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
可能很有用任何方法。