9

我正在尝试实例化一个 ViewModel 以在我的所有活动中使用。

public class LaunchActivity extends Activity {
    private Controller control;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_launch);
         control = ViewModelProviders.of(this).get(Controller.class);
    }
}

control = ViewModelProviders.of(this) <--但我在声明它无法解析时遇到错误of(this),但基于 Android Developer on Implementing ViewModel 的示例;扩展 ViewModel 的类应该能够在 Activity 上实例化,对吗?

如果我做错了,我应该如何为我的 Activity 实例化一个 ViewModel 对象?我是否必须n使用 Fragment 创建多个 Activity,因为ViewModelProviders.of()仅适用于 Fragment?

4

6 回答 6

24

您需要使用该support library活动。

AppCompatActivity或者FragmentActivity

于 2017-12-07T15:12:40.677 回答
10

@elmorabea 的回答是正确的,但这里需要注意的重要一点是,如果您启用了 AndroidX并且仍然遇到表明您需要传入片段而不是活动的问题,请确保您的类扩展了正确的AppCompatActivity。IE,请确保您使用的是:

import androidx.appcompat.app.AppCompatActivity;

并不是

import android.support.v7.app.AppCompatActivity;

因为一个来自 AndroidX 而另一个不是。有关 AndroidX 迁移的更多信息,请参阅链接。

于 2019-01-14T16:18:50.163 回答
5

你正在扩展Activity. ViewModelProvidersFragmentActivity继承自它的事物一起使用,例如AppCompatActivity. 它也适用于Fragment( android.support.v4.app.Fragment) 的反向移植。Activity本机或Fragment类没有官方支持。

于 2017-12-07T15:11:05.317 回答
4

如果您不想更改活动以从另一个活动类扩展,则另一种解决方案(如果您的 BaseActivity 已被使用并且严重依赖Activity并且如果更改父活动类可能会导致错误):

@Nullable
private ViewModelStore viewModelStore = null;

@Override
public Object onRetainNonConfigurationInstance() {
    return viewModelStore;
}

@NonNull
private ViewModelStore getViewModelStore() {
    Object nonConfigurationInstance = getLastNonConfigurationInstance();
    if (nonConfigurationInstance instanceof ViewModelStore) {
        viewModelStore = (ViewModelStore) nonConfigurationInstance;
    }
    if (viewModelStore == null) {
        viewModelStore = new ViewModelStore();
    }
    return viewModelStore;
}

public ViewModelProvider getViewModelProvider() {
    ViewModelProvider.Factory factory =
            ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());
    return new ViewModelProvider(getViewModelStore(), factory);
}

这个逻辑类似于FragmentActivity

然后,ViewModelProviders.of(this)我们只需要调用而不是调用getViewModelProvider()。为了得到Controller

control = getViewModelProvider().get(Controller.class)

通过这样做,我们不需要添加android.arch.lifecycle:extensions依赖项。

于 2018-10-28T11:44:17.770 回答
2

我正在使用这个:

 LoginViewModel viewModel = ViewModelProviders.of(this).get(LoginViewModel.class);

参考:https ://developer.android.com/topic/libraries/architecture/viewmodel#java

于 2018-11-21T11:01:15.987 回答
1

对我来说,我正在扩展AppCompatActivity,但它仍然无法正常工作。但是implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'丢失了,添加它工作正常。

于 2021-03-21T01:34:34.983 回答