web-dev-qa-db-fra.com

Erreur de type sur ViewModelProviders N ° de (fragment)

J'essaie de parcourir le tutoriel google sur la construction d'une bonne architecture ap . J'utilise Java 8 et le SDK 26 . Voici le code que j'ai jusqu'à présent:

package test.me;

import Android.app.Fragment;
import Android.Arch.lifecycle.ViewModel;
import Android.Arch.lifecycle.ViewModelProviders;
import Android.os.Bundle;
import Android.support.annotation.Nullable;

public class ChronoFragment extends Fragment {

    private ViewModel my_model;

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        my_model = ViewModelProviders.of(this).get(ViewModel.class);  // <-- error on this
        // and so on
    }
}

Le problème est que jusqu'à présent, le SDK renvoie l'erreur suivante:

Cannot resolve the method 'of(test.me.ChronoFragment)'.

Je ne comprends pas ça depuis

  • ChronoFragment est de type Fragment
  • La méthode ViewModelProviders # de (Fragment) existe et est accessible via le sdk.

Une idée sur ce que je fais mal?

6
fxm

Les composants d'architecture utilisent appcompat Fragment de la bibliothèque de support plutôt que la bibliothèque native. Essayez de changer votre import pour Fragment en

import Android.support.v4.app.Fragment;

Pour des raisons historiques, il existe deux classes Fragment différentes. Ils ont les mêmes fonctionnalités mais existent dans deux packages différents. Pour plus de détails, voir Pourquoi existe-t-il deux classes de fragments dans Android?

Au 6 février 2019:

Il existe maintenant une troisième classe Fragment. Si vous utilisez les nouvelles bibliothèques AndroidX, alors faites

import androidx.fragment.app.Fragment;

Veillez à utiliser la classe Fragment correcte, qui est cohérente avec le reste de vos dépendances.

13
Code-Apprentice

J'ai eu le même problème, ce que la documentation de Google ne vous dit pas, c'est que vous devez ajouter les dépendances suivantes dans votre fichier Build Gradle, puis "Sync".

implementation "Android.Arch.lifecycle:extensions:1.1.1"
annotationProcessor "Android.Arch.lifecycle:compiler:1.1.1"
3
matshidis

J'ai eu le même problème, le studio Android importait automatiquement Android.support.v4.app.Fragment; mais j'utilisais Android. si votre situation est la même, vous devez utiliser androidX imports partout

import androidx.fragment.app.Fragment;
0
a2en