Я создал очень минимальный проект Android Studio, используя библиотеку, расположенную по адресу https://github.com/arranlomas/DaggerViewModelHelper, чтобы внедрить мою ViewModel в мой фрагмент.Я хочу динамически добавить фрагмент в свою активность и вставить в него зависимости фрагмента (ViewModel, о котором я упоминал ранее), без необходимости явно создавать эти зависимости в Activity.Вот некоторый код для пояснения:
class MainActivity : AppCompatActivity(), Injectable {
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_home -> {
message.setText(R.string.title_home)
val weeklyFragment = WeeklyFragment.newInstance()
openFragment(weeklyFragment)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_dashboard -> {
message.setText(R.string.title_dashboard)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_notifications -> {
message.setText(R.string.title_notifications)
return@OnNavigationItemSelectedListener true
}
}
false
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ButterKnife.bind(this)
val viewModel = ViewModelProviders.of(this, viewModelFactory).get(MyViewModel::class.java)
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
}
private fun openFragment(fragment: Fragment) {
val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.content_container, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
И мой код WeeklyFragment:
class WeeklyFragment : Fragment(), Injectable {
// View elements
@BindView(R.id.weekly_text) lateinit var myTextView: TextView
// View Model Factory
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
companion object {
fun newInstance(): WeeklyFragment = WeeklyFragment()
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater.inflate(R.layout.fragment_weekly, container, false)
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val viewModel = ViewModelProviders.of(this, viewModelFactory).get(MyViewModel::class.java)
viewModel.makeFooString().observe(this, Observer<String> { myTextView.text = it })
}
}
Прямо сейчас я могу внедрить MyViewModel в свой MainActivity и использовать его(если я немного переставлю код), но я хочу внедрить MyViewModel в WeeklyFragment без необходимости объявлять его в MainActivity.Я подозреваю, что должен изменить способ создания экземпляра и «транзакции.replace» WeeklyFragment, но я не нашел информации о том, как конкретно этого добиться.Когда я запускаю приведенный ниже код, я получаю:
java.lang.IllegalArgumentException: No injector was found for com.dev.myproject.view.weekly.WeeklyFragment
at dagger.android.support.AndroidSupportInjection.findHasFragmentInjector(AndroidSupportInjection.java:92)
at dagger.android.support.AndroidSupportInjection.inject(AndroidSupportInjection.java:57)
at com.arranlomas.daggerviewmodelhelper.AppInjector$handleActivity$1.onFragmentCreated(AppInjector.kt:61)
at android.support.v4.app.FragmentManagerImpl.dispatchOnFragmentCreated(FragmentManager.java:3467)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1387)
at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1188)
at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:1071)
at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:115)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2380)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:703)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Как я могу успешно внедрить зависимости в WeeklyFragment?