본문 바로가기

분류 전체보기

(222)
[Android/Kotlin] 커스텀 달력 만들기 MainActivity 위에 FirstFragment가 있고 그 위에 CalendarFragment가 올라간 꼴이다. 1. CalendarFragment 추가 이제 달력을 보여줄 Fragment를 추가한다. 레이아웃은 최상단에 년, 월을 보여주는 TextView, 바로 아래에 일~토를 표시해줄 LinearLayout, 그 아래에 달력을 보여줄 RecyclerView를 품고있는 LinearLayout으로 구성했다. fragment_calendar.xml 굳이 LinearLayout으로 RecyclerView를 감싸주지 않아도 되지만 나중에 CalendarFragment에 Adapter를 붙일 때 item_view의 높이를 조절해주기 위해서 감싸줬다. class CalendarFragment : Fragme..
[Android/Kotlin] ViewPager2 - Infinite Loop 이 글에서는 어떻게 무한로딩 ViewPager2를 만드는지, Infinite Loop ViewPager2를 만드는 방법에 대해 다룰 것이다. 말만 확장이지 일반적인 ViewPager2와 별 차이 없고 약간의 트릭으로 무한 루프처럼 보이게 할 뿐이다. 1. FragmentStateAdapter 추가 위에서 말했듯이 약간의 트릭으로 무한 루프처럼 보이게 만들어야 한다. Adapter를 붙일 때 fragment의 수를 엄청 많이 만들어서 사용자가 페이지를 아무리 넘겨도 끝이 없는 것처럼 만드는 방법이다. 찝찝하지만 며칠동안 찾아본 예제 중에 내가 원하는대로 작동하는 예제는 이것밖에 없는 것 같다. FragmentStateAdapter에서 getItemCount()의 반환값을 Int.MAX_VALUE로 지정해서..
[Android][스크랩] Fragment에서 Back Key Event 처리 Fragment에서 Back키가 눌렸을 때 이를 받아먹고 싶지만, 이게 뜻대로 안 됨. 키 이벤트는 다 액티비티가 받아먹으니까. 그래서 Fragment가 붙어있는 액티비티에다가, (다시말해, Fragment에서 getActivity를 하면 얻을 수 있는 Activity에서) public interface onKeyBackPressedListener { public void onBack(); } private onKeyBackPressedListener mOnKeyBackPressedListener; public void setOnKeyBackPressedListener(onKeyBackPressedListener listener) { mOnKeyBackPressedListener = listener; }..
[Android] Fragment 간 ViewModel Data 공유 단일 액티비티에서 다수의 프레그먼트 사용시 같은 Data를 이용할 경우가 많다. 프레그먼트 별로 ViewModel 객체를 생성할 경우 데이터 공유가 어렵다. 해결방법 다수의 프레그먼트에서 Data를 공유해서 사용할 경우가 있다. 1개의 Activity에 2개의 Fragment가 있고, 각 Fragment는 Message Data를 전송/수신 한다고 하자. Fragment1 : Message 전송 역할 ( Data 업데이트 ) Fragment2 : Message 수신후 보여주는 역할 ( Data 변화 감지 ) ViewModel, Fragment1, Fragment2 코드는 아래와 같다. class MyViewModel : ViewModel() { val message = MutableLiveData() f..
[Android] Coroutine, Retrofit을 활용한 비동기 네트워킹 처리 중 에러 핸들링 개요 안드로이드에서 비동기 처리를 하는 대표적인 방법 중 하나는 Retrofit과 Coroutine을 활용하는 것이다. 이 과정에서 다양한 네트워크 오류 상황에 대응하기 위한 다양한 에러 핸들링 방법에 대해 소개하는 게시글이다. 1. try.. catch 블럭 가장 전통적인 방법이다. 단순히 네트워킹이 필요한 위치에 try..catch 블럭을 활용하면 된다. fun updateProfile(file: File) = viewModelScope.launch(Dispatchers.IO) { try{ repository.updateProfile(file) }catch(e: Exception){ //에러 처리 코드 } } 가장 흔하고 간단한 방법이지만 한 앱에서 여러 개의 네트워킹 처리 함수가 존재할텐데, 각 함..
JSON to Kotlin class 플러그인 으로 데이터 클래스 생성하기 1. preference -> plugin 에서 'json to kotlin' 검색 후 Install 검색이 안된다면 Marketplace 탭에서 했는 지 확인 Install 후 찾을 수 없다면 안드로이드 스튜디오 재부팅 2. data class를 만들려고 하는 위치에서 우측 마우스 클릭하여 new -> Kotlin data class file from Json 팝업 3. Kotlin data class file from Json 팝업 되면 하단 Advaced 버튼 클릭(Json 라이브러리 설정, 필수임) Annotation 탭에서 Gson 체크 Other 탭에서 Only Created annotations when needed 체크 OK 버튼 클릭 4. Json 텍스트 창에 Json 데이터를 넣고 하단..
FragmentStateAdapter class FragmentPageAdapter(fragment: Fragment): FragmentStateAdapter(fragment) { override fun getItemCount(): Int = 2 override fun createFragment(position: Int): Fragment { return when(position) { 0 -> ReceivedFragment() 1 -> SentFragment() else -> ReceivedFragment() } } } ReceiveFragment.kt class ReceivedFragment : BaseFragment(R.layout.fragment_received) { private val viewModel by activityViewM..
코루틴 기본 개념 및 활용(CoroutineScope/GlobalScope/ViewModelScope/LifecycleScope) 코루틴 코루틴(Coroutines) 은 쓰레드(Thread)와 기능적으로는 비슷하지만, 하나의 쓰레드 내에서 여러 개의 코루틴이 실행되는 개념으로 비동기 프로그래밍에 권장되는 동시 실행 설계 패턴입니다. 코루틴은 단일 쓰레드 내에서 여러 개의 코루틴을 실행할 수 있기 때문에, 많은 양의 동시 작업을 처리할 수 있으면서 메모리 절약의 장점이 있습니다. 이유는, 기존 쓰레드는 Context-Switching(CPU가 쓰레드를 점유하면서 실행, 종료를 반복하며 메모리 소모)이 발생하기 때문에 많은 양의 쓰레드를 갖기가 어렵지만 반면에 코루틴은 쓰레드가 아닌 루틴을 일시 중단(suspend) 하는 방식이라 Context-Switching에 비용이 들지 않기 때문입니다. 또한, 지정된 작업 범위 내에서 실행이 되..