匕首android对androidx.fragment的支持

时间:2018-08-16 15:43:26

标签: dagger-2 androidx dagger

如何从软件包 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中的一个片段

7 个答案:

答案 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' 

示例代码:https://github.com/jega-ms/android-dagger2-mvp-rx

答案 5 :(得分:0)

这就是我为Dagger 2.21使用androidx命名空间所做的工作

  1. 从此处下载了jetifier工具:https://developer.android.com/studio/command-line/jetifier

  2. 解压缩到一个文件夹中,然后打开一个指向提取的bin文件夹的终端

  3. 在Android Studio中,打开一个类似DaggerFragment的类来检查文件的存储路径,对我来说(在MacOS中)是这样的: enter image description here

  4. 从终端执行此命令(替换正确的变量和路径)

    ./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文件夹中

  5. 现在打开您的应用build.gradle文件并更改此行
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
    在包含数组中添加, '*.aar'部分

  6. 将生成的dagger-android-support-2.21.aarbin移动到项目内的libs文件夹中。

  7. 从依赖项中删除(或注释)此行 implementation "com.google.dagger:dagger-android-support:2.21

    现在您可以继续使缓存无效并重建项目,现在DaggerFragment将指向使用androidx.fragment.app.Fragment

  8. 的转换版本
  

注意:显然,这是一个临时解决方法,当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