일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- room
- hilt
- ViewModel
- BOJ
- Algorithm
- View
- activity
- lifecycle
- DataBinding
- Navigation
- notification
- 코틀린
- HTTP
- Coroutine
- 알고리즘
- onMeasure
- kotlin
- LiveData
- sqlite
- CoordinatorLayout
- AppBarLayout
- 백준
- 안드로이드
- CustomView
- recyclerview
- Android
- CollapsingToolbarLayout
- onLayout
- Behavior
- 알림
- Today
- Total
목록Android (안드로이드) (99)
개발일지
Hilt Entry Point Entry Point는 Hilt가 Inject하는 진입점이다. Activity, Fragment 같이 Android Framework에 의해 제공되는 Component들은 @AndroidEntryPoint를 통해 진입점을 지정할 수 있고, 일반 객체들도 @Inject constructor를 정의하여 진입점을 만들어 Inject할 수 있다. 하지만 Hilt가 지원하지 않는 Class에 Inject할 경우가 존재하고 이를 해결하기 위해 EntryPoint를 설정해야한다. class DeleteToDoSnackbar( private val view: View, private val todo: ToDo ) { private val entryPoint by lazy { EntryPo..
DataStore Jetpack DataStore는 SharedPreferences를 대체하기 위해 나왔다. DataStore는 Key-Value뿐만 아니라, Protocol Buffers를 이용하여 Object를 저장할 수 있고, 동기/비동기를 지원하며 IO에 대한 Exception도 제공하기 때문에 유연하게 코드를 작성할 수 있다. * Android Developer에서 복잡한 구조의 데이터는 Room을 사용해서 저장하는 것을 권장한다. SharedPreferences 단점 Key-Value 형태로 XML파일에 값을 저장하고 String 또는 Primitives 값만 저장할 수 있다. => 이를 해결하고자 JSON이나 XML형식의 String으로 저장하지만 Type Safety를 보장하지 않기 때문에..
ViewModelScope ViewModel마다 존재하는 Scope이다. ViewModel이 삭제되면 자동으로 취소된다. class ExampleViewModel : ViewModel() { init { viewModelScope.launch { /* ViewModel이 사라지면 종료된다. */ } } } LifeCycleScope LifeCycle 객체마다 존재하는 Scope이다. Create, Start, Resume 3가지의 Mode를 지원하고 Active상태(화면에 보이는 상태)일 때만 수행된다. class CoroutineFragment : BaseFragment(R.layout.fragment_coroutine) { private var count = 0 private val logList b..
Dialog Activity나 Fragment과 다른 작은 화면의 창입니다. 특정 작업전에 입력을 받거나 알람용도로 쓰입니다. DatePickerDialog 달력에서 날짜를 선택하여 Listener를 통해 값을 받을 수 있다. private fun initOnDatePicker() { binding.setOnDatePicker { val calendar = GregorianCalendar() DatePickerDialog(requireContext(), { dialog, year, month, dayOfMonth -> binding.result = """ Dialog : ${dialog.id} Event : ${SimpleDateFormat.getDateInstance().format(GregorianC..
ViewModel with SavedStateHandle ViewModel은 UI Data를 안전하게 보관하는 방법의 하나입니다. onSavedInstaceState()를 사용하지 않고 데이터를 쉽게 저장/복원 할 수 있고 메모리에 저장하기 때문에 SavedStateHandle에 비해 빠릅니다. 하지만 메모리에 저장하기 때문에 Android Framework에서 메모리를 회수하면 저장된 값을 잃습니다. 하지만 SavedStateHandle은 디스크에 직렬화하여 저장하기 때문에 값을 유지할 수 있습니다. => ViewModel에서는 이러한 문제점을 해결하기 위해 SavedStateHandle을 쉽게 조작할 수 있도록 도와줍니다. ViewModel SavedInstanceState Persistent Sto..
Hilt Component 삽입을 실행할 때 @InstallIn 주석을 사용하여 참조할 수 있는 구성요소를 설정하고 구성요소에 맞는 대상에서만 삽입할 수 있다. Hilt Component 인젝터 대상 ApplicationComponent Application ActivityRetainedComponent ViewModel ActivityComponent Activity FragmentComponent Fragment ViewComponent View ViewWithFragmentComponent @WithFragmentBindings 주석이 지정된 View ServiceComponent Service Hilt Component Lifetimes Hilt는 Hilt Component별 Android Cla..
Hilt Module 생성자를 사용할 수 없는 Class를 주입해야 하는 경우 @Inject 생성자를 정의할 수 없습니다. (Interface, Builder를 통해 생성되는 Class, 외부 라이브러리 클래스 등) => Hilt Module을 통해 Class를 어떻게 얻는지 정의하여 의존성을 주입할 수 있습니다. @Module, @Installin @Module로 지정된 Class는 Hilt에게 인스턴스를 제공하는 방법을 알려줍니다. @Module로 지정된 Class는 @Installin을 지정하여 각 모듈이 어떤 Scope에서 사용되는지 알려야 합니다. @Provides 외부 라이브러리에서 제공되거나 Builder 패턴으로 제공되는 경우 @Provides를 통해 인스턴스를 제공하는 방법을 알려줄 수 ..
Hilt 기존의 Dagger2를 Android의 구조적으로 맞게 기능을 추가한 라이브러리이다. DI를 도와주며 Annotaion을 통해 보일러 플레이트 코드를 제거하고 쉽게 사용할 수 있다. DI (Dependency Injection) Android뿐만 아니라 프로그래밍에서 널리 사용되는 기법이고 다양한 이점이 있다. 코드의 재사용성 리팩토링 용이성 테스트 용이성 클래스에서 다른 클래스를 참조하는 방법은 크게 3가지가 있습니다. (Car와 Engine을 예시로) 1. 클래스에서 필요한 종속 클래스를 인스턴스화하는 방법 class Car { private val engine = Engine() fun start() { engine.start() } } fun main(args: Array) { val c..