ViewModel无法在活动

时间:2017-12-07 15:08:26

标签: 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);
    }
}

但我在control = ViewModelProviders.of(this) <--收到错误,指出它无法解析of(this),但是基于Android Developer关于实施ViewModel的示例here;扩展ViewModel的类应该能够在Activity上实例化,我是对的吗?

如果我在做什么是错的,我应该如何为我的Activity实例化一个ViewModel对象?我是否必须使用片段创建n个活动数量,因为ViewModelProviders.of()仅适用于片段?

6 个答案:

答案 0 :(得分:11)

您需要使用support library活动。

AppCompatActivityFragmentActivity

答案 1 :(得分:8)

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

var array = [
  {id1: {}},
  {id2: {}},
  {id3: {}},
];

console.log(array.filter(({id2, id3}) => id3 || id2));

而不是

import androidx.appcompat.app.AppCompatActivity;

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

答案 2 :(得分:5)

您正在延长ActivityViewModelProviders适用于FragmentActivity以及从中继承的内容,例如AppCompatActivity。它也适用于Fragmentandroid.support.v4.app.Fragment)的后端。对原始ActivityFragment类没有官方支持。

答案 3 :(得分:2)

如果您不想将活动更改为从另一个Activity类扩展(如果您的BaseActivity已被使用并且严重依赖Activity,并且如果更改父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依赖项。

答案 4 :(得分:1)

我正在使用这个:

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

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

答案 5 :(得分:1)

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