Search code examples
androidviewmodelandroidxandroid-viewmodel

Android Studio, AndroidX, "Cannot resolve method.." on ViewModelProviders.of(this)


As I can see this is pretty common misunderstanding. I am currently following one online guide, so I can get into the things in android studio. So the problem is that on cotactViewModel = ViewModel.Providers.of(this).get(ContactViewModel.class);, on this it notes Cannot resolve method of(this). I browse the web, if the activity is a Fragment/ViewModel activity, it actually works, but the guy on the guide does it using Empty Activity.

Thanks!


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.courseproject_pmiu">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity" />
    </application>
</manifest>

MainActivity.java

package com.example.courseproject_pmiu;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import androidx.lifecycle.ViewModelProviders;

public class MainActivity extends AppCompatActivity {

    private ContactViewModel contactViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        contactViewModel = ViewModelProviders.of(this).get(ContactViewModel.class);
    }
}

build.gradle(Module:app)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.courseproject_pmiu"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    def lifecycle_version = "2.0.0-rc01"
    def room_version = "2.0.0-rc01"

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:cardview-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'android.arch.lifecycle:extensions:1.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

}

Solution

  • The problem is that you're using androidX lifecycle libraries but you're not migrate to androidX.

    If you want to migrate to androidX then remove support libs and use AndroidX libs.

    To solve this import androidX instead of support.

    Use:

    import androidx.appcompat.app.AppCompatActivity;
    

    instead of:

    import android.support.v7.app.AppCompatActivity;
    

    For this you have to remove all support libraries from your build.gradle app level and add androidX appCompact.

    After modify your build.gradle look like this.

    dependencies {
    def lifecycle_version = "2.0.0-rc01"
    def room_version = "2.0.0-rc01"
    
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
    
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    annotationProcessor "androidx.lifecycle:compiler:$lifecycle_version"
    
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
    }
    

    Important:

    And at last check your gradle.properties these below properties are there if not add them:

    android.useAndroidX=true
    android.enableJetifier=true
    

    Else

    Not recomended

    If you prefer to use support libraries then import these pre-androidX libs for lifecycle.