Updated main screen using dagger
1 parent 7fa43e1 commit e16a8f7c91a13318e1c1a0a1bd9c2e0145f6397a
KeijuMatsumoto authored on 5 May 2018
Showing 7 changed files
View
27
app/src/main/java/keijumt/devandroid/activity/BaseActivity.kt
package keijumt.devandroid.activity
 
import android.arch.lifecycle.ViewModelProvider
import android.support.v4.app.Fragment
import android.support.v7.app.AppCompatActivity
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.support.HasSupportFragmentInjector
import keijumt.devandroid.di.Injectable
import javax.inject.Inject
 
/**
* Activityの基底クラス
*/
abstract class BaseActivity : AppCompatActivity() {
abstract class BaseActivity : AppCompatActivity(), HasSupportFragmentInjector, Injectable {
 
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject
lateinit var androidInjector: DispatchingAndroidInjector<Fragment>
 
override fun supportFragmentInjector(): AndroidInjector<Fragment> {
return androidInjector
}
}
View
5
app/src/main/java/keijumt/devandroid/di/module/ActivityModule.kt
package keijumt.devandroid.di.module
 
import dagger.Module
import dagger.android.ContributesAndroidInjector
import keijumt.devandroid.activity.MainActivity
 
/**
* Module: Activity 定義
*/
@Module
internal abstract class ActivityModule {
 
@ContributesAndroidInjector(modules = arrayOf(FragmentModule::class))
internal abstract fun mainActivity(): MainActivity
 
}
View
5
app/src/main/java/keijumt/devandroid/di/module/FragmentModule.kt
package keijumt.devandroid.di.module
 
import dagger.Module
import dagger.android.ContributesAndroidInjector
import keijumt.devandroid.fragment.MainFragment
 
/**
* Module: Fragment 定義
*/
@Module
internal abstract class FragmentModule {
 
@ContributesAndroidInjector
internal abstract fun mainFragment(): MainFragment
 
}
View
7
app/src/main/java/keijumt/devandroid/di/module/ViewModelModule.kt
import android.arch.lifecycle.ViewModelProvider
import dagger.Binds
import dagger.MapKey
import dagger.Module
import dagger.multibindings.IntoMap
import keijumt.devandroid.viewmodel.MainViewModel
import keijumt.devandroid.viewmodel.ViewModelFactory
import kotlin.reflect.KClass
 
@MustBeDocumented
@Module
internal abstract class ViewModelModule {
 
@Binds
@IntoMap
@ViewModelKey(MainViewModel::class)
abstract fun bindMainViewModel(viewModel: MainViewModel): ViewModel
 
@Binds
abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
 
}
View
16
app/src/main/java/keijumt/devandroid/fragment/BaseFragment.kt
package keijumt.devandroid.fragment
 
import android.app.Fragment
import android.arch.lifecycle.ViewModelProvider
import android.support.v4.app.Fragment
import keijumt.devandroid.di.Injectable
import javax.inject.Inject
 
/**
* Fragmentの基底クラス
*/
abstract class BaseFragment : Fragment() {
abstract class BaseFragment : Fragment(), Injectable {
 
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
}
View
6
app/src/main/java/keijumt/devandroid/fragment/MainFragment.kt
package keijumt.devandroid.fragment
 
 
import android.arch.lifecycle.ViewModelProviders
import android.databinding.DataBindingUtil
import android.os.Bundle
import android.support.v4.app.FragmentActivity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import keijumt.devandroid.R
 
lateinit var binding: FragmentMainBinding
lateinit var mainViewModel: MainViewModel
 
 
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val nonNullActivity: FragmentActivity = activity ?: return null
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, null, false)
mainViewModel = MainViewModel()
mainViewModel = ViewModelProviders.of(nonNullActivity, viewModelFactory).get(MainViewModel::class.java)
binding.mainViewModel = mainViewModel
return binding.root
}
 
View
3
■■
app/src/main/java/keijumt/devandroid/viewmodel/MainViewModel.kt
package keijumt.devandroid.viewmodel
 
import android.arch.lifecycle.ViewModel
import javax.inject.Inject
 
class MainViewModel : ViewModel() {
class MainViewModel @Inject constructor() : ViewModel() {
}