GetSupportFragmentManager(). getFragments() показывает ошибку времени компиляции

Вызов getSupportFragmentManager().getFragments() показывает ошибку времени компиляции с сообщением ниже:

getSupportFragmentManager(). getFragments() можно вызывать только из в той же библиотечной группе (groupId = com.android.support)

Я импортировал следующие классы в 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 extends AppCompatActivity.

Уровень моего проекта build.gradle уровня модуля проекта выглядит следующим образом:

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'
}

Это исходный код метода getFragments внутри 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();

Недавно я обновил свою Android-студию до последней стабильной версии (2.3) и обновил плагин Android Gradle. Я думаю, что это может быть актуально, потому что я ранее не видел эту ошибку.

Ответ 1

Как видно в FragmentManager документации, getFragments() не является общедоступным методом, доступным для приложений, но внутренняя деталь реализации Поддержка библиотеки, следовательно, использование RestrictTo аннотации, которое было добавлено для предотвращения использования частных API.

Вы хотите изменить свой код, чтобы не использовать getFragments, и использовать только общедоступные API.

Ответ 2

Альтернатива Для тех, кто может использовать getFragments() в своем кодировании, я заменил свой код, чтобы получить последний фрагмент в backstack к этому коду (я использую этот код в onBackPressed() для применения изменений в соответствии с currentFragment предполагается, что все фрагменты добавляются в backstack):

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

Ответ 3

Вы можете использовать (убедитесь, что с помощью 25.2.0 или выше)

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) 

Вместо использования getFragments()