web-dev-qa-db-ja.com

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;

MainActivityAppCompatActivityを拡張します。

私のプロジェクトモジュールレベル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 documentation で明らかなように、getFragments()はアプリで利用可能なパブリックメソッドではなく、サポートライブラリの内部実装の詳細であるため、 RestrictTo注釈 プライベートAPIの使用を防ぐために追加されました。

getFragmentsを使用せず、パブリックAPIのみを使用するようにコードを変更する必要があります。

17
ianhanniballake

代替コーディングでgetFragments()を使用している可能性のある人のために、backstackの最後のフラグメントをこのコードに変更するためにコードを置き換えました(onBackPressed()でこのコードを使用しています)すべてのフラグメントがバックスタックに追加されると仮定して、currentFragmentに従って変更を適用します):

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

使用できます(必ず 25.2. 以上を使用してください)

_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()を使用する代わりに

3
user8192276