首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android 2只要活动,碎片就能存活。

Android 2只要活动,碎片就能存活。
EN

Stack Overflow用户
提问于 2018-03-10 20:07:36
回答 1查看 603关注 0票数 1

我有一个带有底部栏的活动,它切换两个片段galleryFramentprofilefragment,它们被注入MainActivity

代码语言:javascript
复制
class MainActivity : DaggerAppCompatActivity(), MainContract.View {

@Inject
lateinit var galleryFragment: GalleryFragment

@Inject
lateinit var profileFragment: ProfileFragment

我以这样的方式在他们之间切换:

代码语言:javascript
复制
val transaction = fragmentManager.beginTransaction()
transaction.replace(frameId, fragment)
transaction.commit()

提供MainActivity的具有作用域@ActivityScoped的模块

代码语言:javascript
复制
  @Module
  abstract class ActivityBindingModule {

    @ActivityScoped
    @ContributesAndroidInjector(modules = arrayOf(MainModule::class, GalleryModule::class, ProfileModule::class))
    internal abstract fun mainActivity(): MainActivity

提供GalleryFragment的模块

代码语言:javascript
复制
  @Module
internal abstract class GalleryModule {

    @FragmentScoped
    @ContributesAndroidInjector
    abstract fun galleryFragment(): GalleryFragment

    @ActivityScoped
    @Binds
    abstract fun galleryPresenter(galleryPresenter: GalleryPresenter): GalleryContract.Presenter


    @Module
    companion object {
        @ActivityScoped
        @Provides
        @JvmStatic
        fun galleryAdapter(context: Context): GalleryAdapter {
            return GalleryAdapter(context);
        }
    }
}

最后,AppComponent

代码语言:javascript
复制
@Singleton
@Component(modules = arrayOf(ImagesRepositoryModule::class,
        ApplicationModule::class,
        ActivityBindingModule::class,
        AndroidSupportInjectionModule::class,
        EventsModule::class))
interface AppComponent : AndroidInjector<MyApplication> {

GalleryFragment提供了来自GaleryModule@FragmentScoped注释。我从张贴在这里的google蓝图样本中提取了带注释的https://github.com/googlesamples/android-architecture(https://github.com/googlesamples/android-architecture][google-archutecture) @FragmentScoped@ActivityScoped示例。

probem是:,当我切换片段时,会创建GalleryFrament的新实例(每次调用onCreate()),但我希望使用以前创建的实例。正如我所理解的那样,GalleryFragment应该是@ActivityScoped(为了使它在活动存续期间保持活力),但是如果我设置它,@ContributesAndroidInjector会生成与其父组件相同范围的子组件,这是非法的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-10 22:13:16

如果您想让您的片段在您的活动范围内,您就不能用@ContributesAndroidInjector来创建片段子组件,而不是

代码语言:javascript
复制
@FragmentScoped
@ContributesAndroidInjector
abstract fun galleryFragment(): GalleryFragment

试着像这样把它移到你的同伴身上

代码语言:javascript
复制
@Provides
@ActivityScoped
@JvmStatic
fun galleryFragment(): GalleryFragment = GalleryFragment.newInstance()

或者从GalleryFragment类中删除它

代码语言:javascript
复制
@ActivityScope
class GalleryFragment 
@Inject
constructor() : Fragment()

虽然我不想这样做,但为什么要有与活动生命周期相匹配的片段呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49213525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档