안드로이드 스튜디오

[안드로이드 스튜디오 코틀린] MVVM 패턴 BaseActivity, BaseFragment 적용(ViewBinding)

권송미 2023. 8. 25. 10:51
728x90
반응형

 

 

 

 

 

ViewBinding을 사용한 MVVM 패턴 Base Code

 

 

 

 

 

 

 

 

 

BaseActivity.kt

 

import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.WindowInsets
import android.view.WindowInsetsController
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModel
import androidx.viewbinding.ViewBinding

abstract class BaseActivity<VB: ViewBinding, VM: ViewModel>: AppCompatActivity() {

    protected lateinit var binding : VB
    protected lateinit var viewModel: VM

    abstract fun getViewBinding(): VB
    abstract fun createViewModel(): VM

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = getViewBinding()
        viewModel = createViewModel()
        setContentView(binding.root)
    }
}

 

 

 

 

 

 

 

 

* viewmodel도 getViewModel() 함수로 만들면

Platform declaration clash: The following declarations have the same JVM signature (getViewModel()Landroidx/lifecycle/ViewModel;): fun `<get-viewModel>`(): VM defined in 에러가 발생한다

 

 

 

그 이유는 AndroidX 라이브러리의 ViewModel 클래스의 getViewModel() 함수 시그니처가 충돌하여 발생하기 때문이다

-> 때문에 createViewModel()함수로 만들어준다.

 

 

 

 

 

 

 

 

 

 

 

 

 

BaseFragment.kt

 

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModel
import androidx.viewbinding.ViewBinding

abstract class BaseFragment<VB: ViewBinding, VM: ViewModel>: Fragment() {

    protected lateinit var binding: VB
    protected lateinit var viewModel: VM

    abstract fun getViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB
    abstract fun createViewModel(): VM

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        binding = getViewBinding(inflater, container)
        viewModel = createViewModel()
        return binding.root
    }
}

 

 

 

BaseViewModel.kt

 

 

 

import androidx.lifecycle.ViewModel

abstract class BaseViewModel: ViewModel() {


}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MainActivity.kt

 

 

import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import com.example.mvvm.base.BaseActivity
import com.example.mvvm.databinding.ActivityMainBinding
import com.example.mvvm.viewmodel.activity.MainViewModel

class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {

    override fun getViewBinding(): ActivityMainBinding {
        return ActivityMainBinding.inflate(layoutInflater)
    }


    override fun createViewModel(): MainViewModel {
        return ViewModelProvider(this)[MainViewModel::class.java]
    }
    

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }

}

 

 

 

 

 

HomeFragment.kt

 

 

 

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import com.example.mvvm.base.BaseFragment
import com.example.mvvm.databinding.FragmentHomeBinding
import com.example.mvvm.viewmodel.fragment.HomeViewModel

class HomeFragment : BaseFragment<FragmentHomeBinding, HomeViewModel>() {

    override fun getViewBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentHomeBinding {
        return FragmentHomeBinding.inflate(layoutInflater)
    }
    

    override fun createViewModel(): HomeViewModel {
        return ViewModelProvider(this)[HomeViewModel::class.java]
    }
    

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    }
}
728x90
반응형