如何从软件包 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中的一个片段
答案 0 :(得分:2)
在 HasFragmentInjector 的情况下,我遇到了同样的问题。您需要使用 HasSupportFragmentInjector 进行片段注入。这是因为HasFragmentInjector
使用android.app.Fragment
不受影响的jetifier
。您需要添加android-dagger-support
库,jetifier
在Studio 3.3中将所有支持包都转换为androidx(如果启用了jetifier
)。
如果jetifier不会将支持包更改为androidx包。您可以从here下载jetifier
工具,并使用以下命令手动转换 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中转换库。 我必须手动进行。
答案 1 :(得分:1)
将以下内容添加到gradle.properties文件中
android.useAndroidX = true
android.enableJetifier = true
答案 2 :(得分:1)
将以下代码添加到gradle.properties
android.useAndroidX = true
android.enableJetifier = true
如果您要插入片段,则必须将AndroidInjection.inject(this)
替换为AndroidSupportInjection.inject(this)
答案 3 :(得分:0)
我有一个类似的错误,这是由于Dagger版本造成的。在版本2.17上,存在一个奇怪的问题,但是如果您回滚到版本2.16,则它可以完美地编译(除了Paul发布的gradle.properties上的标志)。
从那里开始使用教程,您将不会遇到麻烦。忘了提到我的项目中,我拥有所有版本的非androidX版本,然后运行了android studio提供的androidX迁移,此后我不得不切换Dagger版本,但是我想如果您从一开始就这样做一样。
希望这会有所帮助,如果您切换并且不起作用,请发布一些您的dagger实现和插件版本,我将尝试提供更多帮助!
答案 4 :(得分:0)
仅供参考。我有同样的问题。这是Jetifier问题。请将您的gradle构建工具插件升级到3.3.0
classpath 'com.android.tools.build:gradle:3.3.0'
答案 5 :(得分:0)
这就是我为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中修复此问题后,您应该移至正式版本
答案 6 :(得分:0)
解决我特定问题的方法是使用android匕首类作为接口,而不是扩展它们:
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