분류 전체보기 (34) 썸네일형 리스트형 Animation 1 - Tween Animation Tween Animation 은 View Animation 의 한 종류로 View 의 위치, 투명도, 크기, 회전을 지정한 시간동안 수행하는 애니메이션입니다. Tween Animation 의 종류는 아래와 같습니다. ① TranslateAnimation → View 의 좌표를 변경하여 위치를 변경시키는 애니메이션입니다. ② AlphaAnimation → View 의 투명도를 변경하는 애니메이션입니다. ③ ScaleAnimation → View 의 가로와 세로 크기를 변경하는 애니메이션입니다. ④ RotateAnimation → View 를 회전시키는 애니메이션입니다. Tween Animation 은 코드 또는 XML 을 이용하여 View 에 적용할 수 있습니다. 코드를 이용한 Tween Animation.. edge-to-edge edge-to-edge 란 ① edge-to-edge 란 앱 컨텐츠를 system bar(status bar + navigation bar) 영역까지 확장하여 표시하게 만드는 것을 말합니다. 쉽게 말해 status bar 와 navigation bar 를 투명하게 만들어서 앱 컨텐츠가 보이게 만드는 것을 말합니다. edge-to-edge 구현 ① system bar 의 색상 변경 앱이 edge-to-edge 로 동작할 때 앱 컨텐츠를 볼 수 있도록 status bar 와 navigation bar 의 색상을 투명하게 만들어야 합니다. 앱이 이 단계를 수행한 후 시스템은 Gestrue Navigation 모드에서는 navigation bar 뒤에 있는 컨텐츠에 따라 색상을 변경하는 dynamic color.. Room DB 와 RoomTrackingLiveData Room 의 구성요소인 Dao 에서 getAll() 과 같은 메서드에서는 리턴타입을 LiveData 형태로하면 연결된 테이블의 데이터가 변경되면 옵저버들에게 통지가 가도록 만들 수 있습니다. 그런데 생각을 해보다 좀 이상한 부분이 있었습니다. LiveData 는 관찰 가능한 데이터 홀더 클래스로 값이 변경될 때 setValue 또는 postValue 메서드를 호출하여 옵저버들의 onChanged 메서드를 호출하여 통지를 해주는 방식으로 동작합니다. 그렇게 하려면 데이터소스에서 데이터를 읽어온 후 LiveData 에 값을 설정하는 메서드에서 setValue 를 호출해줘야지만 옵저버들에게 통지가 가게됩니다. 즉 아래와 같이 Activity 또는 Fragment 에서 먼저 LiveData 옵저버를 등록한 후 .. Location 기능 사용 시 워크플로우 (1) 위치 액세스 권한 흐름 ① Manifest 파일에 ACCESS_COARSE_LOCATION(대략적 위치) 과 ACCESS_FINE_LOCATION(정확한 위치) 권한을 선언합니다. ② 사용자가 위치 정보에 액세스해야 하는 기능(예: 배달앱의 초기 주소 설정 등)을 실행할 때 권한이 존재하는지 검사 후 없다면 사용자에게 런타임 권한 요청을 합니다. 만약 앱에서 정밀한 위치 정보가 필요한 경우에는 ACCESS_COARSE_LOCATION 과 ACCESS_FINE_LOCATION 을 함께 요청해야 합니다. 만약 ACCESS_FINE_LOCATION 만 요청하는 경우 Android 12 이상을 타겟팅하는 경우 "ACCESS_FINE_LOCATION must be requested with ACCESS_C.. Custom View onMeasure Custom View 의 크기를 지정하기 위한 작업을 onMeasure 메서드에서 해야 합니다. onMeasure 메서드의 매개변수는 부모 View 에서 측정한 자식 View 의 widthMeasureSpec 과 heightMeasureSpec 입니다. MeasureSpec 은 Mode 와 Size 를 인코딩한 정수값입니다. CustomView 의 layout_width 또는 layout_height 를 MATCH_PARENT 또는 특정 dp 로 설정하면 , 부모 View 에서 측정하여 전달한 MeasureSpec 의 Mode 가 EXACTLY 로 설정되어 onMeasure 에 전달되며, wrap_content 로 설정하면 AT_MOST 로 전달됩니다. EXACTLY 로 전달된 경우 부모 View 에서 .. Android 권한 안드로이드 권한 유형 (1) 설치 시간 권한: 앱에서 설치 시간 권한을 선언하면 시스템에서는 사용자가 앱을 설치할 때 자동으로 앱에 권한을 부여합니다. 앱스토어에서는 사용자가 앱의 세부정보 페이지를 볼 때 설치 시간 권한 안내를 표시합니다. (2) 런타임 권한: 런타임 권한은 위험 권한이라고도 잠재적으로 민감한 정보가 포함된 특별 유형의 제한된 데이터에 액세스 하기 위해서 요구되는 권한입니다. 예를들어 위치 정보와 연락처 정보등이 있습니다. 권한의 필요성에 대한 평가 앱에서 권한을 선언하기 전에 권한의 필요성을 먼저 고려해야 합니다. 런타임 권한을 요청하는 경우 사용자가 권한을 요청하는 이유를 이해하지 못한다면 권한을 거부하거나 앱을 제거할 수도 있기 때문입니다. 그리고 이미 기기에 설치된 다른 앱이 내.. 코틀린 확장 함수 코틀린에는 기존 클래스를 상속받지 않고도 기능을 추가할 수 있는 확장 함수라는 기능이 있습니다. String 과 같이 final class 와 같이 상속이 불가능한 클래스도 확장 함수를 사용하면 기능을 추가할 수 있습니다. 이 글에서는 코틀린의 확장 함수가 어떤 방식으로 자바 코드로 변환되는지 확인 해보겠습니다 테스트 코드(ExtensionFunctionTest.kt) fun String.lastChar() = this.get(this.length - 1) 테스트 코드(Executor.kt) fun main() { val ext = "Extension Function" ext.lastChar() } String 클래스에 lastChar() 라는 확장 함수를 만드는 코드입니다. 이렇게 확장 함수를 만들면 .. Firebase Ream-Time Database Paging 처리 Firebase Real-Time Database 에서 데이터를 읽어와서 RecyclerView 또는 ViewPager2 에 데이터를 연결할 때 고려해야 하는 부분 중 서버에서 데이터를 한번에 읽어오지않고 사용자의 스크롤 지점에 따라서 조금씩 읽어오는 방식으로 하는 것이 좋습니다. 예를들어 서버에 저장된 Post 가 총 100개라고 하면 앱을 실행하면 최초로 10개만 받아오고 사용자가 스크롤하여서 앞으로 보여줄 아이템이 3~4개 정도 남아있을 때 다시 10개를 받아오는 방식으로 한다면 사용자에게 쾌적한 앱 서비스를 제공하는데 도움이 됩니다. 이 글에서는 Firebase Real-Time Database 를 사용하여 Paging 처리하는 방법에 대해 작성합니다. 1. 로딩한 데이터를 보여줄 ViewPage.. lateinit 과 by lazy 분석 lateinit 과 by lazy 모두 지연 초기화를 위해 사용되는 것으로만 알고 있었고, lateinit 은 var 에만 사용할 수 있고 by lazy 는 val 에만 사용할 수 있다 정도만 알고 있었습니다.. 어떻게 동작하는지는 관심이 없었는데 시간이 나서 이번 기회에 내부적으로 각각 어떻게 내부적으로 동작하는지를 알고 싶어서 분석하게 되었습니다. 1. lateinit 테스트 코드 class LateinitTest { private lateinit var name: String fun test() { println(name) } } 위의 코드를 자바로 변환하면 아래와 같은 자바 코드가 보입니다. lateinit 의 동작 방식을 간단히 말하면 lateinit 으로 선언된 프로퍼티에 접근하면 내부적으로 .. DialogFragment width 조정 앱을 개발하던 중 Dialog 가 필요해서 적용을 하기위해, DialogFragment 의 레이아웃의 width 를 match_parent 로 주고 margin 값을 이용해서 양쪽 여백을 만들려고 했으나 예상했던것과 다르게 동작하는 문제가 발생했습니다. 검색을 해보니 나와 비슷한 문제를 겪으신 분들이 많은 것 같습니다. 그 중 하나의 솔루션을 발견했고 적용한 결과 처음 원했던 대로 스크린 width 의 90%만 차지하는 Dialog 를 만들 수 있었습니다. ... override fun onResume() { super.onResume() resizeDialog() } private fun resizeDialog() { val windowManager = requireActivity().getSystem.. 이전 1 2 3 4 다음