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?
@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迁移的详细信息,请参阅此链接。
你正在扩展Activity.ViewModelProviders使用FragmentActivity和从中继承的东西,例如AppCompatActivity.它也适用于Fragment(android.support.v4.app.Fragment)的backport .对本地人Activity或Fragment班级没有官方支持.
如果您不想更改您的活动以从另一个活动类扩展(如果您的 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依赖项。
| 归档时间: |
|
| 查看次数: |
5339 次 |
| 最近记录: |