Android 如何获取ViewModel?

Android 如何获取ViewModel?,android,android-fragments,viewmodel,deprecated,Android,Android Fragments,Viewmodel,Deprecated,我只想在片段(扩展片段)中获得对ViewModel.class(扩展自AndroidViewModel)的引用。到处都是这样描述的: UserModel userModel = ViewModelProviders.of(getActivity()).get(UserModel.class); ,但ViewModelProviders很久以前就被弃用了 *API级别1.1.0中不推荐使用此类* 我无法导入具有以下内容的类: android.arch.lifecycle.[ViewModelP

我只想在片段(扩展片段)中获得对ViewModel.class(扩展自AndroidViewModel)的引用。到处都是这样描述的:

UserModel userModel = ViewModelProviders.of(getActivity()).get(UserModel.class);


,但ViewModelProviders很久以前就被弃用了

*API级别1.1.0中不推荐使用此类*

我无法导入具有以下内容的类: android.arch.lifecycle.[ViewModelProviders]

它只提供ViewModelProvider和其他功能


我如何才能获得UserModel.class的实例


但是ViewModelProviders早就被弃用了

ViewModelProviders
未被弃用。因此,请使用
ViewModelProviders

ViewModelProviders.of(yourFragment).get(UserModel.class)
有些
ViewModelProviders
已被弃用,例如其构造函数,但该类总体上未被弃用

更新:2020-05-28现在
ViewModelProviders
已被弃用。在Kotlin中,使用viewModels()的
和相关属性委托。在Java中,使用
新建ViewModelProvider(…).get(UserModel.class)
(根据这些viewmodels的范围,使用
的各种值)。

以下是如何编写


将Kotlin与最新的Android体系结构组件一起使用时,应使用viewModels()的
Kotlin属性委托,如下所示:

class YourFragment:Fragment(){
私有val viewModel by viewModels()
}

更多信息类
ViewModelProviders
已弃用! 理解使用
ViewModelProvider

MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);

快乐编码:)

在深入研究之后,我通过在活动中添加以下方法解决了类似的问题:

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);
}
还是碎片

private MyViewModel myViewModel;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getActivity() != null) {
        myViewModel = (MyViewModel) obtainFragmentViewModel(getActivity(), MyViewModel.class);
    }
}
到目前为止似乎效果不错。如果有人有更好的方法,请让我们知道

is的Kotlin版本


您在哪里发现*该类在API级别1.1.0中被弃用。*@MaxAves指出它是红色的。我应该从另一个类扩展我的片段吗?还是应该添加一个依赖项?@fabi:“它是红色的”——您缺少
import
语句。您还需要
android.arch.lifecycle:extensions
依赖项,如中所述。不推荐使用ViewModelProviders
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);
}
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);
    }
}
val vm = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)