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()