250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 막내의막무가내 rxjava
- 막내의막무가내 SQL
- 안드로이드 Sunflower 스터디
- 안드로이드 sunflower
- 막내의막무가내 목표 및 회고
- 막내의막무가내 프로그래밍
- flutter network call
- 막내의막무가내 알고리즘
- 막내의막무가내 플러터 flutter
- 막내의막무가내 플러터
- 막내의막무가내 코틀린 안드로이드
- 막내의 막무가내
- 프래그먼트
- 막내의막무가내 안드로이드
- 막무가내
- 안드로이드
- 막내의막무가내 코틀린
- 부스트코스에이스
- 주엽역 생활맥주
- 막내의막무가내 안드로이드 코틀린
- Fragment
- 막내의막무가내 일상
- 막내의막무가내
- 2022년 6월 일상
- 막내의 막무가내 알고리즘
- 부스트코스
- 프로그래머스 알고리즘
- 막내의막무가내 안드로이드 에러 해결
- 주택가 잠실새내
- 막내의막무가내 코볼 COBOL
Archives
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[코틀린] Base 코드 관련 정리 (feat. BaseActivity, BaseFragment) 본문
안드로이드/코틀린 & 아키텍처 & Recent
[코틀린] Base 코드 관련 정리 (feat. BaseActivity, BaseFragment)
막무가내막내 2020. 5. 8. 11:53728x90
[2021-04-13 업데이트]
BaseActivity 같은 것을 만들고 이것을 액티비티에서 상속받아 쓰면 여러모로 편리한 점이 많다. (중복 코드 제거 및 깔끔해짐 등등 )
이것에 대해 기록용 포스팅을 남깁니다.
BaseActivity
package com.mtjin.nomoneytrip.base
import android.os.Bundle
import android.widget.Toast
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import io.reactivex.disposables.CompositeDisposable
abstract class BaseActivity<B : ViewDataBinding>(
@LayoutRes val layoutId: Int
) : AppCompatActivity() {
lateinit var binding: B
private val compositeDisposable = CompositeDisposable()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, layoutId)
binding.lifecycleOwner = this
}
protected fun showToast(msg: String) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
}
override fun onDestroy() {
super.onDestroy()
compositeDisposable.clear()
}
}
class MainActivity : BaseActivity<ActivityMainBinding>(
R.layout.activity_main
) {
BaseViewModel
package com.mtjin.nomoneytrip.base
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import io.reactivex.disposables.CompositeDisposable
abstract class BaseViewModel : ViewModel() {
protected val compositeDisposable = CompositeDisposable()
private val _isLoading = MutableLiveData<Boolean>(false)
val isLoading: LiveData<Boolean> get() = _isLoading
override fun onCleared() {
compositeDisposable.dispose()
super.onCleared()
}
protected fun showProgress() {
_isLoading.value = true
}
protected fun hideProgress() {
_isLoading.value = false
}
}
BaseFragment (세가지종류)
package com.mtjin.nomoneytrip.base
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.annotation.LayoutRes
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
abstract class BaseFragment<B : ViewDataBinding>(
@LayoutRes val layoutId: Int
) : Fragment() {
lateinit var binding: B
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater, layoutId, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this
init()
}
abstract fun init()
protected fun showToast(msg: String) =
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show()
}
package com.mtjin.cnunoticeapp.base
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.annotation.LayoutRes
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
abstract class BaseFragment<B : ViewDataBinding, VM : BaseViewModel>(
@LayoutRes val layoutId: Int
) : Fragment() {
protected lateinit var binding: B
protected abstract val viewModel: VM
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater, layoutId, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this
init()
}
abstract fun init()
protected fun showToast(msg: String) =
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show()
}
abstract class BaseFragment<VM : ViewModel, B : ViewDataBinding>(
viewModelClass: KClass<VM>,
@LayoutRes val layoutResId: Int
) : DaggerFragment() {
@Inject
lateinit var analytics: EventAnalytics
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
protected val viewModel: VM by viewModel(viewModelClass) { viewModelFactory }
protected lateinit var binding: B
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater, layoutResId, container, false)
with(binding) {
setVariable(BR.viewModel, viewModel)
lifecycleOwner = viewLifecycleOwner
}
return binding.root
}
}
댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!
728x90
'안드로이드 > 코틀린 & 아키텍처 & Recent' 카테고리의 다른 글
[안드로이드] * What went wrong:Execution failed for task ':app:kaptDebugKotlin'.> A fail (7) | 2020.05.22 |
---|---|
[코틀린] Jsoup 파싱 라이브러리 사용 기록 (0) | 2020.05.21 |
[안드로이드] Android Jetpack Navigation 정리 및 BottomNavigationView 에 적용 + ActionBar 적용 (Kotlin) (4) | 2020.04.29 |
[안드로이드] 코틀린 원형차트 예제 (feat. MPAAndroidChart 라이브러리) (0) | 2020.04.28 |
[안드로이드] 코틀린 list 를 자바의 vararg 로 받을 수 있게하는 방법 (kotlin list to vararg) (0) | 2020.04.28 |
Comments