我在底部栏有活动,可以切换插入到galleryFrament
的两个片段profilefragment
和MainActivity
:
class MainActivity : DaggerAppCompatActivity(), MainContract.View {
@Inject
lateinit var galleryFragment: GalleryFragment
@Inject
lateinit var profileFragment: ProfileFragment
我以这种方式在它们之间切换:
val transaction = fragmentManager.beginTransaction()
transaction.replace(frameId, fragment)
transaction.commit()
提供
MainActivity
,范围为@ActivityScoped
的模块: @Module
abstract class ActivityBindingModule {
@ActivityScoped
@ContributesAndroidInjector(modules = arrayOf(MainModule::class, GalleryModule::class, ProfileModule::class))
internal abstract fun mainActivity(): MainActivity
提供
GalleryFragment
的模块: @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
:@Singleton
@Component(modules = arrayOf(ImagesRepositoryModule::class,
ApplicationModule::class,
ActivityBindingModule::class,
AndroidSupportInjectionModule::class,
EventsModule::class))
interface AppComponent : AndroidInjector<MyApplication> {
GalleryFragment
由@FragmentScoped
提供GaleryModule
批注。我从这里发布的Google蓝图样本中选择了注释素@FragmentScoped
和@ActivityScoped
的方法:该示例是:切换片段时,会创建新的
GalleryFrament
实例(每次都会调用onCreate()
),但是我想使用以前创建的实例。据我所知,匕首作用域应为
GalleryFragment
(以使其在活动持续时间内保持活动状态),但是如果我对其进行设置,@ActivityScoped
会产生与其父级具有相同作用域的Subcomponent,这是非法的。 最佳答案
如果要在活动范围中包含片段,则不能使用@ContributesAndroidInjector
创建片段子组件,所以不要
@FragmentScoped
@ContributesAndroidInjector
abstract fun galleryFragment(): GalleryFragment
尝试像这样在同伴中移动它
@Provides
@ActivityScoped
@JvmStatic
fun galleryFragment(): GalleryFragment = GalleryFragment.newInstance()
或从GalleryFragment类中将其删除
@ActivityScope
class GalleryFragment
@Inject
constructor() : Fragment()
尽管我不建议这样做,但为什么要有与活动生命周期匹配的片段?