web-dev-qa-db-ja.com

ViewModelはアクティビティでインスタンス化できません

すべてのアクティビティで使用する1つの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)を解決できないというエラーが表示されましたが、例に基づいて here by Android ViewModelの実装に関する開発者、ViewModelを拡張するクラスは、Activityでインスタンス化できるはずですよね?

私がやっていることが間違っている場合、アクティビティのViewModelオブジェクトをどのようにインスタンス化すればよいですか? ViewModelProviders.of()はフラグメントでのみ機能するので、フラグメントでn個のアクティビティを作成する必要がありますか?

8
dude

support libraryアクティビティを使用する必要があります。

AppCompatActivityまたはFragmentActivity

19
elmorabea

@elmorabeaの答えは正しかったが、ここで注意すべき重要な点の1つは、 AndroidX を有効にしても、アクティビティではなくフラグメントを渡す必要があることを示す問題が引き続き発生する場合は、クラスはcorrectAppCompatActivityを拡張します。 IE、使用していることを確認してください:

import androidx.appcompat.app.AppCompatActivity;

ではなく

import Android.support.v7.app.AppCompatActivity;

1つはAndroidXからで、もう1つはそうではありません。 AndroidXの移行の詳細については、 this リンクを参照してください。

10
PGMacDesign

Activityを拡張しています。 ViewModelProvidersFragmentActivityや、AppCompatActivityなどの継承オブジェクトから機能します。 FragmentAndroid.support.v4.app.Fragment)。ネイティブActivityまたはFragmentクラスの公式サポートはありません。

5
CommonsWare

別の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_依存関係を追加する必要がなくなります。

3
Tuan Chau

私はこれを使用しています:

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

参照: https://developer.Android.com/topic/libraries/architecture/viewmodel#Java

1
Debasish Ghosh