ViewModel无法在Activity中实例化

dud*_*ude 6 android android-layout android-fragments android-viewmodel

我试图实例化一个ViewModel以在我的所有Activity中使用.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但在我得到一个错误control = ViewModelProviders.of(this) <--,指出它不能解析of(this),但是基于例如这里通过实施视图模型Android开发者; 一个扩展ViewModel的类应该能够在Activity上实例化,对不对?

如果我正在做的是错误的,我应该如何为我的Activity实例化一个ViewModel对象?我是否必须n使用Fragment 创建多个Activity(s),因为ViewModelProviders.of()只能使用Fragment?

elm*_*bea 14

您需要使用该support library活动.

AppCompatActivity 要么 FragmentActivity


Sil*_*los 9

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

import androidx.appcompat.app.AppCompatActivity;
Run Code Online (Sandbox Code Playgroud)

并不是

import android.support.v7.app.AppCompatActivity;
Run Code Online (Sandbox Code Playgroud)

由于一个来自AndroidX,而另一个则不是。有关AndroidX迁移的详细信息,请参阅此链接。


Com*_*are 5

你正在扩展Activity.ViewModelProviders使用FragmentActivity和从中继承的东西,例如AppCompatActivity.它也适用于Fragment(android.support.v4.app.Fragment)的backport .对本地人Activity或Fragment班级没有官方支持.

  • @MudasirRao:你在ViewModelProviders中缺少一个"s".如果它仍然不起作用,请确保您的Gradle文件包含依赖项,例如编译'android.arch.lifecycle:extensions:1.1.1' (3认同)

Tua*_*hau 5

如果您不想更改您的活动以从另一个活动类扩展(如果您的 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);
}
Run Code Online (Sandbox Code Playgroud)

这个逻辑类似于FragmentActivity

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

control = getViewModelProvider().get(Controller.class)
Run Code Online (Sandbox Code Playgroud)

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