我正在尝试实例化一个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()
仅适用于片段?
答案 0 :(得分:11)
您需要使用support library
活动。
AppCompatActivity
或FragmentActivity
答案 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)
您正在延长Activity
。 ViewModelProviders
适用于FragmentActivity
以及从中继承的内容,例如AppCompatActivity
。它也适用于Fragment
(android.support.v4.app.Fragment
)的后端。对原始Activity
或Fragment
类没有官方支持。
答案 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'
,添加它可以正常工作。