ViewModel не может быть создан в Activity

Я пытаюсь создать одну 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 по реализации ViewModel; класс, расширяющий ViewModel, должен иметь возможность создавать экземпляр в Activity, я прав?

Если то, что я делаю, неправильно, как мне создать экземпляр объекта ViewModel для моих действий? Должен ли я создавать n число действий с фрагментом (ами), поскольку ViewModelProviders.of() работает только с фрагментом?


person dude    schedule 07.12.2017    source источник
comment
попробуйте использовать AppCompatActivity   -  person Kuffs    schedule 07.12.2017


Ответы (6)


Вам нужно использовать действие support library.

AppCompatActivity or FragmentActivity

person elmorabea    schedule 07.12.2017

Ответ @ elmorabea был правильным, но здесь следует отметить одну важную вещь: если вы включили AndroidX и по-прежнему возникают проблемы, указывающие на то, что вам нужно передать фрагмент вместо действия, убедитесь, что ваш класс расширяет правильный AppCompatActivity. IE, убедитесь, что вы используете:

import androidx.appcompat.app.AppCompatActivity;

и не

import android.support.v7.app.AppCompatActivity;

Поскольку один от AndroidX, а другой - нет. Для получения дополнительной информации о миграции AndroidX см. эту ссылку.

person PGMacDesign    schedule 14.01.2019

Вы продлеваете Activity. ViewModelProviders работает с FragmentActivity и вещами, которые наследуются от него, например AppCompatActivity. Он также работает с задним портом Fragment (android.support.v4.app.Fragment). Официальной поддержки нативных классов Activity или Fragment нет.

person CommonsWare    schedule 07.12.2017
comment
Я перехожу из AppCompatActivity. Но все же он показывает ошибку, которая не может разрешить ViewModelProvider.of () - person Mudasir Sharif; 18.03.2018
comment
@MudasirRao: вам не хватает символа s в ViewModelProviders. Если это все еще не работает, убедитесь, что ваш файл Gradle содержит зависимость, например скомпилировать 'android.arch.lifecycle: extensions: 1.1.1' - person Dabbler; 01.04.2018
comment
Вы, вероятно, импортировали androidx.lifecycle.ViewModelProviders вместо android.arch.lifecycle.ViewModelProviders. - person Ewald Benes; 10.12.2018

Другое решение, если вы не хотите изменять свою активность для расширения из другого класса Activity (в случае, если ваша 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 зависимости.

person Tuan Chau    schedule 28.10.2018

Я использую это:

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

Ссылка: https://developer.android.com/topic/libraries/architecture/viewmodel#java

person Debasish Ghosh    schedule 21.11.2018

Для меня я расширял AppCompatActivity, но все равно он не работал. Но implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' отсутствовал, добавление чего работало нормально.

person arun    schedule 21.03.2021