我只想在我的Fragment(扩展Fragment)中引用我的ViewModel.class(从AndroidViewModel扩展)。到处都是这样描述的:
UserModel userModel = ViewModelProviders.of(getActivity()).get(UserModel.class);
description on Android Developer
...,但是很久以前不推荐使用ViewModelProviders。
*该类在API级别1.1.0中已弃用。 *
我无法通过以下方式导入该类: android.arch.lifecycle。[ViewModelProviders]
它仅提供ViewModelProvider和其他内容。
如何获取UserModel.class的实例?
答案 0 :(得分:2)
但是很久以前不推荐使用ViewModelProviders
ViewModelProviders
不被弃用。因此,请使用ViewModelProviders
:
ViewModelProviders.of(yourFragment).get(UserModel.class)
已弃用ViewModelProviders
的件,例如其构造函数,但总体上不是。
答案 1 :(得分:1)
这里是写ViewModel
的方法public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<User>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// Do an asynchronous operation to fetch users.
}
}
然后将其用于您的功能性中
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
// Create a ViewModel the first time the system calls an activity's onCreate() method.
// Re-created activities receive the same MyViewModel instance created by the first activity.
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
答案 2 :(得分:0)
使用Kotlin和最新的Android体系结构组件,您应该像这样使用by viewModels()
Kotlin属性委托:
class YourFragment : Fragment() {
private val viewModel by viewModels<YourViewModel>()
}
更多信息here
答案 3 :(得分:0)
不推荐使用类ViewModelProviders
!
使用已理解的ViewModelProvider
。
MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
快乐编码:)
答案 4 :(得分:0)
深入研究后,我通过向“活动”中添加以下方法解决了类似的问题:
protected final <T extends ViewModel> ViewModel obtainViewModel(@NonNull AppCompatActivity activity, @NonNull Class<T> modelClass) {
ViewModelProvider.AndroidViewModelFactory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(activity.getApplication());
return new ViewModelProvider(activity, factory).get(modelClass);
}
然后我在片段中做到了:
protected final <T extends ViewModel> ViewModel obtainFragmentViewModel(@NonNull FragmentActivity fragment, @NonNull Class<T> modelClass) {
ViewModelProvider.AndroidViewModelFactory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(fragment.getApplication());
return new ViewModelProvider(fragment, factory).get(modelClass);
}
我已经有了一些用于菜单目的的抽象超类,因此我将方法隐藏在那里,因此不必在每次活动中都重复它。这就是为什么他们受到保护。我相信,如果您将它们放在需要它们的每个活动或片段中,它们可能是私有的。
为了尽可能清晰,我将在活动中调用方法在onCreate()中分配视图模型,看起来像这样
private MyViewModel myViewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myViewModel = (MyViewModel) obtainViewModel(this, MyViewModel.class);
}
或分段
private MyViewModel myViewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getActivity() != null) {
myViewModel = (MyViewModel) obtainFragmentViewModel(getActivity(), MyViewModel.class);
}
}
到目前为止,它似乎工作正常。如果有人有更好的方法,请告诉我们!
答案 5 :(得分:0)
BeirDav's answer 的 Kotlin 版本是
val vm = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)