パッケージからフラグメントを注入する方法androidx.fragment.app.Fragment?
dagger-Android フレームワークを使用して、コードに依存関係を注入しています。
ドキュメントには、フラグメントを注入するためにこれを行うと書かれています
@Override
public void onAttach(Activity activity) {
AndroidInjection.inject(this);
super.onAttach(activity);
// ...
}
問題は、AndroidSupportInjectionクラスがパッケージAndroid.support.v4.app.Fragmentのフラグメントのみを受け入れるか、またはAndroidInjectionクラスは、Android.app.Fragmentパッケージのフラグメントのみを受け入れ、androidx.fragment.app.Fragmentパッケージのフラグメントを使用したい。
また、DaggerFramentはAndroid.support.v4.app.Fragmentから拡張し、からのフラグメントを使用したいandroidx
そして、HasSupportFragmentInjectorを実装しようとすると、このインターフェースもAndroid.supportからのフラグメントを使用します
gradle.propertiesに以下のコードを追加します
Android.useAndroidX = true
Android.enableJetifier = true
そして、フラグメントに注入しようとしている場合は、AndroidInjection.inject(this)
をAndroidSupportInjection.inject(this)
に置き換える必要があります
HasFragmentInjectorの場合にも同じ問題がありました。フラグメントの注入には、HasSupportFragmentInjectorを使用する必要があります。これは、HasFragmentInjector
がjetifier
によって影響を受けないAndroid.app.Fragment
を使用するためです。 Android-dagger-support
ライブラリを追加する必要があります。jetifier
は、すべてのサポートパッケージをStudio 3.3のandroidxに変換します(jetifier
が有効な場合)。
Jetifierがサポートパッケージをandroidxパッケージに変更しない場合。 jetifier
ツールを here からダウンロードして、Android-dagger-support.aarファイルを手動で変換できます。次のコマンドを使用します。
./jetifier-standalone -i dagger-Android-support-<version>.aar -o <output-name>
次に、ライブラリをプロジェクトに追加します。これは、変換後のHasSupportFragmentクラスです
import androidx.fragment.app.Fragment;
import dagger.Android.AndroidInjector;
public interface HasSupportFragmentInjector {
AndroidInjector<Fragment> supportFragmentInjector();
}
どういうわけか、jetifierツールはAndroidStudioのライブラリを変換していませんでした。手動でやらなければなりませんでした。
私の特定の問題の解決策は、Android daggerクラスを拡張する代わりにインターフェイスとして使用することでした:
class MyFragment() : HasSupportFragmentInjector {
@Inject
lateinit var childFragmentInjector: DispatchingAndroidInjector<Fragment>
override fun onAttach(context: Context?) {
AndroidSupportInjection.inject(this)
super.onAttach(context)
}
override fun supportFragmentInjector(): AndroidInjector<Fragment> {
return childFragmentInjector
}
........
}
私の活動へ
class MyActivity : HasSupportFragmentInjector {
@Inject
internal lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
}
override fun supportFragmentInjector(): AndroidInjector<Fragment> = fragmentInjector
......}
また、私はこれを私のgradle.propertiesファイルに持っています:
Android.useAndroidX = true Android.enableJetifier = true
これは私がDagger 2.21のandroidx
名前空間で作業するためにしたことです
ここからjetifier
ツールをダウンロードしました: https://developer.Android.com/studio/command-line/jetifier
フォルダーに解凍し、抽出されたbin
フォルダーを指すターミナルを開きます
Android Studio、DaggerFragment
などのクラスを開いてファイルが保存されているパスを確認します。私にとって(MacOSの場合)は次のようになります。
ターミナルからこのコマンドを実行します(正しい変数とパスで置き換えます)
_./jetifier-standalone -i /Users/{YOUR_USER}/.gradle/caches/{PATH_TO_DAGGER_Android_SUPPORT_FOLDER}/dagger-Android-support-2.21.aar -o dagger-Android-support-2.21.aar
_
変換された_dagger-Android-support-2.21.aar
_はbin
フォルダーに表示されます
アプリの_build.gradle
_ファイルを開き、この行を変更しますimplementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
インクルード配列に_, '*.aar'
_部分を追加
生成された_dagger-Android-support-2.21.aar
_をbin
からプロジェクト内のlibs
フォルダーに移動します。
依存関係からこの行を削除(またはコメント)_implementation "com.google.dagger:dagger-Android-support:2.21
_
キャッシュの無効化を続行してプロジェクトを再構築すると、DaggerFragment
が_androidx.fragment.app.Fragment
_を使用する変換されたバージョンを指すようになります。
注:これは明らかに一時的な回避策であり、Daggerで修正されるとすぐに公式バージョンに移行する必要があります
同様のエラーが発生しましたが、これはDaggerバージョンが原因でした。バージョン2.17には奇妙な問題がありますが、バージョン2.16にロールバックすると、(Paulが投稿したgradle.propertiesのフラグを除き)完全にコンパイルされます。
そこからチュートリアルを使用すると、問題は発生しません。私のプロジェクトではすべての非AndroidXバージョンがあったことを忘れていましたが、androidX移行を実行しましたAndroidスタジオオファー、その後ダガーバージョンを切り替える必要がありましたが、あなたが最初からそれを行う場合、それは同じだと仮定します。
切り替えて機能しない場合は、これが役立つことを願っています。短剣の実装とプラグインのバージョンを少し投稿してください。私はもっと助けようとします!
参照用です。私は同じ問題を抱えていました。それはJetifierの問題でした。 gradleビルドツールプラグインを3.3.0にアップグレードしてください
classpath 'com.Android.tools.build:gradle:3.3.0'
Gradle.propertiesファイルに次を追加します
Android.useAndroidX = true
Android.enableJetifier = true