Senior Software Engineer @ Acorns
/** * @deprecated Use {@link FragmentManager#getFragmentFactory()} and * {@link FragmentFactory#instantiate(ClassLoader, String)}, manually calling * {@link #setArguments(Bundle)} on the returned Fragment. */ @Deprecated @NonNull public static Fragment instantiate(@NonNull Context context, @NonNull String fname, @Nullable Bundle args)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
supportFragmentManager.beginTransaction()
.replace(R.id.container, MainFragment.newInstance("session token"))
.commitNow()
}
private const val KEY_SESSION_TOKEN = "KEY_SESSION_TOKEN"
class MainFragment : Fragment() {
private lateinit var session: String
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
session = arguments?.getString(KEY_SESSION_TOKEN) ?: ""
}
companion object {
fun newInstance(session: String): MainFragment {
return MainFragment().apply {
arguments = Bundle().apply {
putString(KEY_SESSION_TOKEN, session)
}
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportFragmentManager.fragmentFactory = FragmentFactoryImpl("session token")
setContentView(R.layout.main_activity)
supportFragmentManager.beginTransaction() // null = bundle args
.replace(R.id.container, MainFragment::class.java, null)
.commitNow()
}
class MainFragment(
private val session: String
) : Fragment() {
// contents of fragment
}
val fragment = supportFragmentManager.fragmentFactory
.instantiate(classLoader, MainFragment::class.java.name)
supportFragmentManager.beginTransaction()
.replace(R.id.container, fragment)
.commitNow()
class FragmentFactoryImpl(
private val session: String
) : FragmentFactory() {
override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
return when (className) {
MainFragment::class.java.name -> MainFragment(session)
else -> super.instantiate(classLoader, className)
}
}
}
class MainFragment: Fragment() {
@Inject lateinit var session: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val component = DaggerAppComponent.builder().build()
component.inject(this)
}
}
class MainFragment @Inject constructor(
private val session: String
) : Fragment() {
// contents of fragment
}
@Module
abstract class FragmentModule {
@Binds
abstract fun bindFragmentFactory(fragmentFactory: FragmentFactoryImpl): FragmentFactory
@Binds
@IntoMap
@FragmentKey(MainFragment::class)
abstract fun bindMainFragment(mainFragment: MainFragment): Fragment
@Binds
@IntoMap
@FragmentKey(OtherFragment::class)
abstract fun bindOtherFragment(otherFragment: OtherFragment): Fragment
}
fun bindMainFragment(session: String) = MainFragment(session)
class FragmentFactoryImpl @Inject constructor(
private val fragmentProviders: Map<Class<out Fragment>, Provider<Fragment>>
) : FragmentFactory() {
override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
val fragmentClass = loadFragmentClass(classLoader, className)
val fragmentProvider = fragmentProviders[fragmentClass]
return fragmentProvider?.get() ?: super.instantiate(classLoader, className)
}
}