All

안드로이드 시스템 환경설정에는 애니메이션 끄기 여부를 선택할 수 있는 기능이 있다. 해당 토글을 ON 처리하면 디바이스 전반적으로 애니메이션 기능이 제거된다. 하지만 애니메이션이 사용된 앱 같은 경우, 정상적인 View 동작을 위해 분기처리가 필요한 경우가 있다. 이럴 때, 다음 코드를 통해 애니메이션 활성화 여부를 확인할 수 있다. fun isAnimationEnabled(context: Context): Boolean { var isEnable = true try { isEnable = Settings.Global.getFloat(context.contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE) != 0f } catch (e: Settings.Set..
EditText에 하이픈(-)이 자동 추가되도록 TextWatcher에서 지원하는 PhoneNumberFormattingTextWatcher를 사용할 수 있다. 아래 Listener를 등록만 해도 자동으로 전화번호 형식이 입력되는 것을 확인 가능하다. binding.numberEdit.addTextChangedListener(PhoneNumberFormattingTextWatcher())
안드로이드의 Activity에서는 navigationBarColor를 다음과 같이 지정해줄 수 있다. activity.window.navigationBarColor = getColor(R.color.white) 그런데, Activity 수준에서 색상을 지정해도 Bottom Sheet를 열면 적용되어 있지 않아 별도로 지정이 필요하다. 다음과 같이 override되는 Dialog 객체를 통해 지정 가능하다. override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = super.onCreateDialog(savedInstanceState) dialog.window?.navigationBarColor = activity.get..
안드로이드에서 외부 URL을 열 때, 보통 WebView를 많이 사용하지만 그보다 속도가 빠르고, 탭에 대한 커스터마이징이 가능한 Chrome Custom Tab이라는 기능이 있다. 먼저 해당 디바이스에서 pakageManager를 통해 크롬 사용 가능 여부를 확인하여, 가능한 경우 Service 사용 단계로 넘어가도록 처리해주었다. fun isChromeEnabled(context: Context): Boolean = context.packageManager.getPackageInfo("com.android.chrome", 0).applicationInfo.enabled openChromeWebService() 라는 함수를 새로 만들어, 해당 함수 내에서 실질적인 Chrome Tab View 작업을 진..
안드로이드 ImageView의 테두리 형태를 지정하기 위해 Background Drawable을 다음과 같이 구성하여 작업 중이었다. BottomSheet 형태의 디자인을 만들고, 해당 View에 원하는 이미지를 CenterCrop 형태로 채워서 넣으려했다. android:scaleType="centerCrop" -> 이미지의 가로/세로의 길이 중 짧은 쪽을 ImageView의 레이아웃에 가득 채워 출력한다. 이 때 원본 이미지 가로/세로의 비율은 유지되고 레이아웃 영역에서 벗어난 이미지는 출력되지 않는다. 하지만 이미지를 삽입하니 기존에 생성했던 Background를 무시하고 이미지의 형태가 덮어씌워졌다. ImageView는 Image를(src) 새로 삽입하면 보이는 화면과 같이 적용될 수 밖에 없다고..
안드로이드 UI 작업 중, 간혹 원 모양의 View가 필요한 경우가 있습니다. 다음과 같이 Background Resource를 커스텀으로 만들어주는 방법도 있으나, de.hdodenhof:circleimageview 라이브러리를 통해 Circle Image View를 바로 생성하는 방법 또한 있습니다. https://github.com/hdodenhof/CircleImageView ImageView를 확장해서 만들어진 라이브러리이기 때문에 기본 사용법은 ImageView와 동일합니다. implementation 'de.hdodenhof:circleimageview:3.1.0' 아래와 같이 레이아웃을 삽입해주고, 각종 속성들을 설정해줍니다. 옵션 중 civ_border_~ 형태의 옵션들을 통해 Circl..
ViewBinding을 프로젝트에 적용 후, 빌드 과정에서 제목과 같은 Error가 발생했다. - ViewBinding 적용 방법 //In build.gradle(:app) buildFeatures { viewBinding = true } 문제가 발생한 위치를 찾아보니 매우 많은 수의 View들이 사용되는 위젯 레이아웃에서 발생한 문제였다. 현재 위젯은 By Id 기준으로 사용 중이니, 다음과 같이 최상위 View에 ViewBinding 적용을 무시하도록 하면 해결된다. 참고 https://stackoverflow.com/questions/64633323/gradle-too-many-parameters-for-viewbinding
원래 안드로이드에서는 Activity로부터 결과 값을 수신 받을 때, startActivityForResult(), onActivityResult()를 사용했지만 deprecated 되었습니다. 이에 따라 공식문서에서 제안한 새로운 방식인 registerForActivityResult()를 사용해보겠습니다. private lateinit var resultLauncher: ActivityResultLauncher 먼저, MainActivity에서 값을 제네릭으로 처리해줄 Launcher 인스턴스 변수를 생성합니다. Intent 객체를 전달받기 위해 Intent를 제네릭에 명시해주었습니다. nextBtn.setOnClickListener { val intent = Intent(this, SecondActi..
안드로이드에서 앱 구현 중, 다음과 같이 툴팁 메시지 창이 필요한 경우가 있습니다. 라이브러리를 통해 해당 기능을 구현해보도록 하겠습니다. 자세한 내용은 아래 링크를 통해 확인 부탁드립니다. https://github.com/skydoves/Balloon GitHub - skydoves/Balloon: Modernized and sophisticated tooltips, fully customizable with an arrow and animations for Android. :balloon: Modernized and sophisticated tooltips, fully customizable with an arrow and animations for Android. - GitHub - skydove..
디바이스 내의 연락처 앱을 사용하다보면, 여러가지 정보들을 포함시킬 수 있는 것을 확인할 수 있습니다. 프로필 사진, 전화번호, 생일, 메모, 연락처 이름 등 다양한 데이터가 존재하는데, 이 중에서 대표적으로 화면에 보여지고 있는 프로필 사진, 생일, 연락처 이름, 연락처 고유 ID 데이터를 우리가 직접 만든 앱으로 가져올 수 있도록 구현해보겠습니다. 먼저 디바이스 연락처 접근 권한을 얻기 위한 permission tag를 AndroidManifest.xml 파일에 추가해줍니다. private fun getContacts() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PE..