Android/Tips
Android 12 이상 SplashScreen 대응하기 (올바른 SplashScreen 구현하기)
SplashScreen의 구현에 앞서, 우선 Splash가 왜 필요할까? 기본적으로 모든 앱은 실행하면 사용자에게 보여주기까지 데이터를 불러오는 시간이 필요하다. 앱이 실행되는 상태에는 Cold Start, Warm Start, Hot Start 총 3가지가 존재하며, Cold와 Warm 상태일 때 앱을 준비하는 시간이 필요하다. (앱의 실행상태 3가지에 대해 자세한 설명은 이곳 에 설명이 잘 돼있으니 참조하자.) Splash 화면이 없을 때의 앱 실행 모습을 보자. Hello World라는 TextView를 가지고 있는 최초의 View를 보여주기 전에, 앱을 실행하기 위한 준비를 하는 시간(앱 객체 생성, 메인 스레드 시작, 액티비티 초기화, 뷰 붙이기 등)이 필수적으로 존재할 수밖에 없다. 때문에 이..
startActivityForResult Deprecated
startActivityForResult(SearchActivity.newIntent(this@PostArticleActivity), REQUEST_CODE) override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if(resultCode != Activity.RESULT_OK) return when (requestCode) { REQUEST_CODE -> { data?.let { (...중략) } } ?: kotlin.run { Toast.makeText(this, getString(R.string.loadError..
CompileSdk, TargetSdk, MinSdkVersion 비교
CompileSdk, TargetSdk, MinSdk의 관계에 대한 간략한 기록 compileSdk 31 defaultConfig { minSdk 21 targetSdk 30 (app gradle에서 확인할 수 있는 sdk 버전 정보들) 1. compileSdkVersion 단어 그대로 컴파일시에 사용하는 sdk버전이다. 예를들어 어떤 라이브러리를 새롭게 프로젝트에 추가했는데, 해당 라이브러리가 sdk 26 이상을 베이스로 짜여진 라이브러리라면, compileSdkVersion 버전이 25이하라면 해당 라이브러리를 등록시 컴파일 에러가 나타난다. 즉 compileSdkVersion는 최소한 사용하는 라이브러리들의 베이스 SDK 이상으로 설정해야한다. 컴파일시에만 관여하므로 실제 런타임에는 관여하지 않기 ..
툴바(ToolBar) 구현, Toolbar VS Layout
툴바를 구현하는 방법에 대한 고민. 툴바를 구현하는 데에는 아마도 일반적으로, 1. Toolbar widget을 사용하고, menu.xml파일을 구성하여 구현하는 방법 2. Layout view를 사용해서 구현하는 방법 이 2가지가 있을 수 있다. 본인은 안드로이드 개발을 처음 배울 때 2번의 방법으로 툴바를 구현하는 강의를 봤기 때문에 2번 방법만을 사용해 왔지만, 1번 방법과 어떤 차이 및 장단점이 있을까에 대해 알아보고 싶었는데, 찾아봐도 마땅한 이유를 찾기가 쉽지 않았다. 1번 방법은 아마 툴바 구현 방법 이라고 검색하면 가장 많이 나오는, 가장 일반적인 방법이라고 생각 되고, 2번 방법은 일반적인 layout을 마치 툴바'처럼' 구현하는 것이다. 그러면 이 중 어떤게 더 좋은 방법일까? 라고 묻..
RecyclerView에 animation 효과 주기
진행중인 프로젝트에서 아이템이 추가 될 때 마다 새로 생긴 아이템에 animation 효과 (alpha 0->1) 를 줘야했다. 1. 가장 기본적인 방법으로, recyclerview에는 defaultItemAnimator가 설정되어 있기 때문에 간단하게 animation효과를 줄 수 있다. val defaultItemAnimator = DefaultItemAnimator() defaultItemAnimator.addDuration = 1500 defaultItemAnimator.removeDuration = 1000 recyclerView.itemAnimator = defaultItemAnimator 아이템이 추가 혹은 삭제 될 때 마다 설정해놓은 duration 값 만큼 alpha값이 0->1로 증가하..
Recyclerview adapter 재활용하기
Recyclerview는 정말 자주 사용하는 기능 중 하나이기 때문에, 미리 규격화하여 재활용하여 사용하는것이 좋다. interface BoardListListener: AdapterListener { fun onClickItem(model: BoardListModel) } - abstract class ModelViewHolder( binding: ViewBinding, protected val viewModel: BaseViewModel, protected val resourcesProvider: ResourcesProvider ): RecyclerView.ViewHolder(binding.root) { abstract fun reset() open fun bindData(model: M){ rese..
TabLayout
TabLayout 사용에 대한 기록 TabLayout은 주로 fragment와 함께 fragment의 전환을 위해 사용한다. app:tabIndicatorFullWidth="false" indicator의 넓이를 텍스트의 넓이에 맞출 수 있다. app:tabMode="auto" 속성값으로 auto, fixed, scrollable 을 가지며, 메뉴를 한 화면에 전부 보여줄지를 결정한다. app:tabIndicator="@drawable/tab_selector" indicator의 모양을 커스텀할 수 있다. (@drawable/tab_selector) TabLayoutMediator(tabLayout, viewPager) { tab, position -> tab.setText(fieldCategories[..
Retrofit2 Multiple BaseUrl (Java)
Retrofit2를 사용할 때 baseurl을 여러개 사용해야 할 때에는 retrofit2 객체를 그만큼 복수개 생성해주어야 한다. (기본적으로 retrofit2객체는 싱글톤으로 생성하므로 baseurl을 동적으로 바꿀수 없다.) private static Retrofit retrofit = null; public static Retrofit getClient(String baseUrl) { if (retrofit==null) { retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } private static Retro..