43 votes

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

Appelant getSupportFragmentManager().getFragments() indique une erreur de compilation avec le message ci-dessous:

getSupportFragmentManager().getFragments() ne peut être appelée à partir de dans le même groupe de bibliothèque(groupId = com.android.de soutien)

J'ai importé les classes suivantes, en 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 s'étend AppCompatActivity.

Mon projet au niveau du module build.gradle le fichier se présente 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'
}

C'est le code source de la méthode de getFragments à l'intérieur d' 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 pour la dernière version stable (2.3) et de la mise à jour de l'Android plugin Gradle ainsi. Je pense que cela peut être pertinent parce que je n'ai pas déjà vu cette erreur.

18voto

ianhanniballake Points 18370

Comme visible dans l' FragmentManager documentation, getFragments() n'est pas une méthode publique disponible pour les applications, mais interne détail de l'implémentation de la Bibliothèque de prise en charge, d'où l'utilisation de l' RestrictTo d'annotation qui a été ajouté pour empêcher l'utilisation des Api privées.

Vous voudrez modifier votre code pour ne pas utiliser l' getFragments et de n'utiliser les Api publiques.

6voto

Alternative Pour ceux qui, peut-être l'aide d' getFragments() de leur codage, j'ai remplacé mon code pour obtenir le dernier fragment en backstack de ce code(je suis en utilisant ce code en onBackPressed() pour appliquer les modifications en fonction des currentFragment supposé que tous les fragments sont ajoutés à la backstack):

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

3voto

user8192276 Points 31

Vous pouvez utiliser (assurez-vous à l'aide de 25.2.0 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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X