web-dev-qa-db-fra.com

getSupportFragmentManager (). getFragments () affiche une erreur lors de la compilation

L'appel de getSupportFragmentManager().getFragments() affiche une erreur de compilation avec le message ci-dessous:

getSupportFragmentManager (). getFragments () ne peut être appelé qu'à partir du même groupe de bibliothèques (groupId = com.Android.support)

J'ai importé les classes suivantes dans MainActivity:

import Android.os.Bundle;
import Android.support.annotation.NonNull;
import Android.support.design.widget.BottomNavigationView;
import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentManager;
import Android.support.v4.app.FragmentTransaction;
import Android.support.v7.app.AppCompatActivity;
import Android.util.Log;
import Android.view.MenuItem;
import Android.widget.Toast;

MainActivity étend AppCompatActivity.

Mon niveau de module de projet build.gradle fichier est comme suit:

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.mycompany.floatingdemo"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.Android.support', module: 'support-annotations'
    })
    compile 'com.Android.support:appcompat-v7:25.2.0'
    compile 'com.Android.support:design:25.2.0'
    compile 'com.Android.support:support-vector-drawable:25.2.0'
    testCompile 'junit:junit:4.12'
}

Ceci est le code source de la méthode getFragments inside FragmentManager.Java.

/**
 * Get a list of all fragments that have been added to the fragment manager.
 *
 * @return The list of all fragments or null if none.
 * @hide
 */
@RestrictTo(LIBRARY_GROUP)
public abstract List<Fragment> getFragments();

J'ai récemment mis à jour mon Android Studio vers la dernière version stable (2.3) et mis à jour le Android également le plugin Gradle. Je pense que cela peut être pertinent car je n'ont pas déjà vu cette erreur.

42

Comme vous pouvez le constater dans la FragmentManager documentation , getFragments() n'est pas une méthode publique disponible pour les applications, mais un détail d'implémentation interne de la bibliothèque de support, d'où l'utilisation de la RestrictTo annotation qui a été ajouté pour empêcher l'utilisation d'API privées.

Vous voudrez changer votre code pour ne pas utiliser getFragments et utiliser uniquement les API publiques.

17
ianhanniballake

Alternative Pour ceux qui peuvent utiliser getFragments() dans leur codage, j'ai remplacé mon code pour obtenir le dernier fragment dans backstack par ce code (j'utilise ce code dans onBackPressed() pour applique les modifications en fonction de currentFragment en supposant que tous les fragments sont ajoutés à l’arrière-pile):

FragmentManager.BackStackEntry backStackEntryAt = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1);
currentFragment = backStackEntryAt.getName();
6

Vous pouvez utiliser (assurez-vous d'utiliser 25.2. ou supérieur

supportFragmentManager.registerFragmentLifecycleCallbacks(object : FragmentManager.FragmentLifecycleCallbacks() {
    override fun onFragmentAttached(fm: FragmentManager?, f: Fragment?, context: Context?) {
        f?.let { fList.add(it) }
    }

    override fun onFragmentDetached(fm: FragmentManager?, f: Fragment?) {
        f?.let { fList.remove(it) }
    }

}, false) 

Au lieu d'utiliser getFragments()

3
user8192276