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扩展了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' } 

这是FragmentManager.java getFragments方法的源代码。

 /** * 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 Studio到最新的稳定版本(2.3),并更新了Android Gradle插件。 我认为这可能是相关的,因为我以前没有看到这个错误。

FragmentManager文档中 , getFragments()不是可用于应用程序的公共方法,而是支持库的内部实现细节,因此使用添加的RestrictTo注释来防止使用私有API。

你会想改变你的代码不使用getFragments ,只使用公共API。

替代对于那些可能在他们的代码中使用getFragments() ,我已经取代了我的代码,以获得最后一个片段在这个代码(我使用onBackPressed()这个代码应用更改根据currentFragment假设所有片段被添加到堆栈中):

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

你可以使用(确保使用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()